一.指针和数组的区别
数组名是一个地址,而指针是一个左值。
二.指针数组和数组指针
int *p1[5]; 指针数组 // []中的优先级高,故先定义了一个长度5的整型数组,然后数组中的每个元素都是指向int的指针。
int (*p2)[5];数组指针 //()和[]优先级一样,结合后从左往右,故先定义了一个指向整型的p2指针,它指向有5个元素的一维数组。
1.指针数组 (example)
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 3; int d = 4; int e = 5; int *p1[5] = {&a, &b, &c, &d, &e}; int i; for (i = 0; i < 5; i++) { printf("%d ", *p1[i]); } return 0; }
#include <stdio.h> int main() { char *p1[5] = { "让编程改变世界", "just do it", "一切皆有可能", "永不止步", "one more thing" }; int i; for (i=0;i<5;i++){ printf("%s ",p1[i]); } return 0; }
2.数组指针(example)
#include <stdio.h> int main() { int temp[5] = {1, 2, 3, 4, 5}; int (*p2)[5] = &temp; int i; for (i = 0; i < 5; i++) { printf("%d ", *(*p2 + i)); } return 0; }
#include <stdio.h> int main() { int temp[5] = {1, 2, 3, 4, 5}; int *p = temp; int i; for (i = 0; i < 5; i++) { printf("%d ", *(p + i)); } return 0; }
//#include <stdio.h> // //int main() //{ // int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20}; // int *p = (int *)(&array + 1); // // printf("%d ",sizeof(array)); // 84 // printf("%p ", &array); //--> 十进制 6487536 // printf("%p ", (&array+1)); //--> 十进制 6487620 差了一个sizeof(array) // printf("%p ", (&array+2)); //-->十进制 6487704 // printf("%d ", *(p -4)); // // return 0; //} #include <stdio.h> int main() { int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int (*p)[10] = &array; printf("%d ", *(*(p+1)-6)); return 0; }
必须清楚一个指针变量将告诉我们两个信息:某个数据结构的起始地址,以及该结构的跨度。比如 int p = &a; 说明该指针指向变量 a 的起始地址,以及它的跨度为 sizeof(int)。所以 p + 1 == p + sizeof(int)。
int (*p)[10] 虽然是定义一个整型指针,但不要忘了它后边还有一个数组,所以它的跨度应该是 sizeof(int) * 10,而 array 作为数组名,它的含义是“指向数组第一个元素的地址”,所以 array 的跨度是 sizeof(array[0]),因此编译系统遇到 int (*p)[10] = array; 这样的定义就会果断报错:“左右类型不一致”。
指针指向的数组+1:偏移量详解:https://www.cnblogs.com/liushui-sky/p/10025732.html
运算符优先级引用https://fishc.com.cn/forum.php?mod=viewthread&tid=67664&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571