【C语言】指针详解(五)

embedded/2024/9/24 13:15:00/

目录

1.字符指针

1.1常量字符串

2.指针数组

 3.数组指针


1.字符指针

字符指针就是指向字符的指针,字符指针可以存储字符变量的地址。

举例如下:

 定义指针变量pa存a的地址,改变*pa的值,a也会随之改变 。

1.1常量字符串

😀常量字符串: 需用双引号包着
     例如:" hello " ," 你好 "。

如果说有这样的代码:char* p= "helloworld";这里的"helloworld"就是常量字符串,"helloworld"是存储在常量区的,p指向a的地址。

需要注意的地方:

※常量字符串是不能被修改的,如果说有人想写类似于*pa='hello'的这种代码,程序是会崩溃的,所以说我们可以在前面加上const进行保护,写成const char* p = "hello"这种形式,使用常量指针对其进行保护,使得指针p指向的空间无法被修改避免不当操作使得程序崩溃。

*p为字符串中的第一个元素h,那么*(p+1)就为下一个元素e。

下面一道例题请==大家思考一下:p1和p2,p3和p4是否相等

答案是:p1==p2!=p3!=p4

p1与P2相等原因是”abcde“为常量字符串,存储在常量区,指针p1与p2所以p1和p2都是指向这个常量字符串的,都存储的是a的地址,所以p1和p2是相等的

而p3和p4分别是两个数组的初始化,所以p3和p4分别表示两个数组的首元素的地址,所以p3和p4是不同的

2.指针数组

指针数组,顾名思义就是存储指针的数组了,例如int* arr[3]={&a,&b,&c},数组有3个元素,数组中每个元素都是指针,每个元素的类型都是int*,这样的数组就叫做指针数组。

指针数组的一般形式:

数据类型    *数组名[常量表达式][常量表达式]...... ;

下面是一个简单的例子

#include <stdio.h>
int main()
{//定义三个整型数组int a[5] = { 1,2,3,4,5 };int b[5] = { 6,4,8,3,1 };int c[5] = { 2,5,8,6,1 };//定义一个存放指向整型变量的指针的数组arrint* arr[] = { a,b,c };//通过接引用打印出三个一维数组的元素for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", *(arr[i]+j));}printf("\n");}return 0;
}

结果如下:

  1 2 3 4 5

  6 4 8 3 1

  2 5 8 6 1

对于arr的解引用有很多方式,他们都是等价的:

#include<stdio.h>
int main()
{int i = 0;int a[3][4] = { {1,2,3,4} ,{5,6,7,8} ,{9,10,11,12} };//定义一个二维数组int* pa[3];//定义一个指针数组for (i = 0; i < 3; i++)//给指针数组赋值pa[i] = a[i];printf("指针数组的内容为:\n");for (i = 0; i < 3; i++)//打印出指针数组的内容{int j;for (j = 0; j < 4; j++)printf("%d ", *(*(pa + i) + j));printf("\n");}//以下均为不同方式的解引用操作printf("不同解引用操作的结果为:\n");printf("%d,%d\n", a[1][1], *(pa[1] + 1));printf("%d,%d\n", a[1][1], *(*(pa+1) + 1));printf("%d,%d\n", a[1][1], (*(pa + 1))[1]);printf("%d,%d\n", a[1][1], pa[1][1]);return 0;
}

结果如下:

指针数组的内容为:

1 2 3 4
5 6 7 8
9 10 11 12

不同解引用操作的结果为:

6,6
6,6
6,6
6,6

从以上例子可看出解引用有多种方式,它们的等价形式如下:

*( pa[i] + j )         //等价于 *( a[i] + j )

*( *(p+i) + j )        //等价于 *( *(a+j) + j )

( *(p+i) )[ j ]        //等价于( *(a+i) )[ j ]

p[ i ][ j ]                //等价于 a[i][j]

 3.数组指针

数组指针是指向一个数组的指针。更具体地说,它是指向数组的第一个元素的指针。通常用于指向多维数组的第一个维度。例如,如果你有一个包含3个元素的整数数组,你可以声明一个指向这个数组的指针

int (*p)[3];即为一个数组指针,p先与*结合,p2是一个指针变量,因此这是一个指针,指向大小为3的数组,每个元素的类型为int,所以这是一个数组指针

int *q[3];这是一个指针数组,因为[]的优先级高于*p1,遇到方括号会先与方括号结合,因此这是一个有3个元素的数组,而观察q前面的int*,就可以知道这个数组中的每一个元素的类型都是int*,所以这是一个指针数组

以上便是我为大家带来的指针详解(五)的内容,若有不足,望各位大佬在评论区指出,谢谢大家!可以留下你们点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!  


http://www.ppmy.cn/embedded/2661.html

相关文章

selenium——chromdriver版本请及时更新

接python学习笔记&#xff08;23&#xff09;内容 如果某个时刻&#xff0c;你突然发现selenium功能出错了&#xff0c;有可能是google升级了 我们再看看我们现在的google版本 右上角三点>>帮助>>关于chrome>>版本 124.0.6367.61 很显然已经升级了&#…

【C++】每日一题 48 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 #include <vector> using namespace std;class Solution { public:void …

【Tesla T4为例】GPU安装最新版本NVIDIA Driver、CUDA、cuDNN、Anaconda、Pytorch

NVIDIA Driver 进入英伟达官网下载页面 按照以上方式选择即可得到>535.113.01版本的驱动&#xff0c;可以实现多卡推理&#xff0c;小于这个版本会导致多卡训练以及推理报错 虽然最新版本为550.54.15&#xff0c;但是535版本更加稳定&#xff0c;并且pytorch目前只支持到1…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调用onCreate()回调。可以在该回调中…

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

git创建分支并推送到远端,并关联

1&#xff1a;创建本地分支&#xff08;两种方式&#xff09; git checkout -b new_branch_name // 或者&#xff0c;上面一步等于下面这两步 git branch new_branch_name git checkout new_branch_name2&#xff1a;推送到远端 git push origin ${本地分支名称}:${远端分支名…

蓝桥杯刷题-游戏

1388. 游戏 - AcWing题库 #include <bits/stdc.h>using namespace std; const int N 110; int n , s[N]; int f[N][N][2]; int a[N];int sum(int l, int r) {return s[r] - s[l - 1]; }int main() {cin >> n;for(int i 1;i < n;i ){cin >> a[i];s[i] …

热词解析| 制造企业如何跟上新质生产力建设步伐【触想智能】

回顾3月份的网络热词&#xff0c;「新质生产力」在各大平台霸榜刷屏&#xff0c;并且受到两会政府工作报告的频繁聚焦。究竟何为新质生产力?以及&#xff0c;传统制造企业如何加速融入这场火热的现代化产业革新浪潮之中? 图源| 纪录片《加快形成新质生产力》 1、什么是新质生…