最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路
概念:顾名思义就是一个指针,它指向的是一个数组,指向的是一个数组的首地址
我们来看下面这行代码:
#include
#include int main() {int a[3] = {1,2,3};// 这是一个数组指针int (*p1)[3] = &a;// 这是一个普通指针int *p2 = (int *)&a;printf("p1 = %d\n", p1);printf("p2 = %d\n", p2);printf("p1+1 = %d\n", ++p1);printf("p2+1 = %d\n", ++p2);return 0;
}
我们分别定义了一个数组指针和一个普通指针都指向一个地址,可以得到以下数据

当我们定义一个数组后,个指针变量将告诉我们两个信息:
某个数据结构的起始地址,以及该结构的跨度。比如int p = &a;说明该指针指向变量 a 的起始地址,以及它的跨度为sizeof(int)。所以p + 1 == p + sizeof(int),但是int (*p)[10]虽然是定义一个整型指针,但不要忘了它后边还有一个数组,所以它的跨度应该是sizeof(int) * 10,而 array 作为数组名,它的含义是“指向数组第一个元素的地址”,因此array和&array虽然初始值是一样的但是代表的意义是不一样的,&array代表的是数组,详细解释可以参考c语言tips-c/c++中数组名和&数组名的区别
指针数组即是一个数组,数组的每一个元素都是一个指针
再写一段代码表示指针数组
int main() {int a = 1, b = 2, c = 3;int *p[3] = {&a, &b, &c};printf("a = %d, b = %d, c = %d", *p[0], *p[1], *p[2]);return 0;
}

在上述代码中我们定义了三个整型变量,然后定义了一个指针数组,指针数组的三个元素分别指向了三个整型变量,然后我们再取值时需要解引用得到
当然指针数组还有其他有趣的用法,由于字符串可以使用字符指针来存储,即我们可以用指针数组来存储字符串数组,来看以下代码
int main() {char* a = "aaaa";char* b = "bbbb";char* c = "cccc";int *p[3] = {a, b, c};for(int i = 0; i < 3; i++){printf("%s\n", p[i]); }return 0;
}

以上就是我对数组指针和指针数组的理解,欢迎大家评论交流!