开始想写博客是因为看了B站上鹏哥的视频课程,受到了鹏哥的启发。近期大方向是备考上海市C语言二三级的等级考,所以为了提高复习效率放弃了部分内容的学习...后期有时间会把知识点补完的。
1. 一维数组的表达方式
指针,就是存放地址的变量。一般说指针就是地址。
假设有段代码,设置了int数组a[5],问:打印其中第三个数组元素有多少种写法?
int a[5] = { 1,2,3,4,5 };
int* p = a;
//目标:打印第三个数组元素
printf("%d\n", *(p + 2));
printf("%d\n", *(a + 2));
printf("%d\n", a[2]);
printf("%d\n", 2[a]);
printf("%d\n", p[2]);
return 0;
本文就以上列举的五种情况展开介绍。
首先让指针p取到a数组的首元素地址,*p上的*说明其是指针变量,a代表首元素地址(不同于&a)。
前两次打印通过解引用,分别让p、a的地址向后移动2个单位( sizeof(int) ),最后指向第三个元素。
第二、三次打印通过数组。这里要明确的是,2和a是两个操作数,“ [ ] ”是操作符,谁在括号内部都是可以的。就像 a+b = b+a ,顺序交换不影响结果。最后一个 p [ 2 ] 同理。
后三次总的来说就是:一个数组首元素地址,需要移动的地址单位,加以 [ ] 来取地址,最终实现输出。
最终结果如下。
2. 二级指针
--定义
由于指针变量(如*p)也是变量,是变量就会有地址,所以就产生了指向 指针变量地址 的指针,也就是二级指针。二级指针里存放的是某个一级指针的地址。
模仿设置一级指针的思路,可以很快把一个二级指针“套娃”出来。
int a = 10;
int* p = &a;
int** pp = &p;
return 0;
int *p,*说明*p是一个指针,int说明*p是一个指向整型变量的指针。
int* *pp,*说明*pp是一个指针,int*说明*pp是一个指向int型指针变量的指针。
--赋值
给二级指针赋值的思路和给一级指针赋值的思路一样。这里要注意的是,给二级指针赋值时,要写**pp,不是*pp!
**pp,就是先对 pp 解引用(*),找到了存储在内的一级指针p的地址;然后再对 p 解引用(*),找到了存储在内的整型变量a。
int a = 10;
int* p = &a;
int** pp = &p;
**pp = 233;
printf("**pp=%d\n", **pp);
printf("*p=%d\n", *p);
printf("a=%d\n", a);
*p = 123;
printf("**pp=%d\n", **pp);
//注意:给一级指针赋值后,被赋相关地址的二级指针指向的元素也会变化
printf("*p=%d\n", *p);
printf("a=%d\n", a);
return 0;
因为两个指针最终都指向同一个地址,所以输出时都是一样的。
运行结果如下: