最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路
数组指针
概念:顾名思义就是一个指针,它指向的是一个数组,指向的是一个数组的首地址
我们来看下面这行代码:
#include <stdio.h>
#include <stdlib.h>
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;
}
以上就是我对数组指针和指针数组的理解,欢迎大家评论交流!