总结一下C语言中的数组与指针
-
首先先弄明白数组指针与指针数组
指针数组指的是一个元素为指针的数组,数组指针指的是指向数组的指针。
// 普通数组
int a[] = {1, 2, 3, 4, 5};
// 指针数组
int* p[5];
// 数组指针
int (*p)[5] = &a;
- 区分一下数组名与数组名取地址
输出内容相同是因为两个指针存放内容均为数组第一个元素的地址,但是两个指针指向类型不同,因此拥有不同的偏移量。
int a[] = {1, 2, 3, 4};
int (*p)[] = &a;
// 输出内容相同
cout << a << " " << p << endl;
// 输出4, 因为两个指针的偏移量不同
cout << (int*)(p+1) - a << endl;
// memset 操作一个数组时, 这两种方法是等效的
char cc[100];
memset(cc, 0, sizeof(cc));
memset(&cc, 0, sizeof(cc));
- 首先定义了数组a,p为指向数组的指针,ptr为普通的指针,指向的是a[5]后面的一块内存(因为p的偏移量是5),输出ptr前一块内存的元素值,因此输出a[4],即输出5
int a[] = {1, 2, 3, 4, 5};
// 数组的指针
int (*p)[] = &a;
// 普通指针
int* ptr = (int*)(p + 1);
// 输出的是5
cout << *(ptr - 1) << endl;