指针数组指针探究
最近得空,看看以前的笔记, 又实验了下, 挑几个上传
#include <stdio.h> /* int main(void) { int*a[5]; int*(*p)[5]; p = &a; // p = a; 报警告 printf("p=%p \n", p); printf("&a=%p \n", &a); printf("a=%p \n", a); // 觉得这里应该打印不同值 printf("*(p+1)=%p \n", (*(*(p+1)))); // 解引用2层才避免报错 printf("*(a+1)=%p \n", (*(a+1))); // 解引用1层即可避免报错 } // p是指针数组指针 // a是指针数组的数组名 // 探究a == &a ? // 结论:a这个符号表示数组首元素首地址, // 即内部第一个指针元素的首地址,结合前面 // 对函数名取地址的实验,可以推出 // a的值等价于&a. // 另外,采用p=a;会报警告,说明a 和 &a的类型不同。 // 另外根据最后两条printf, p解引用2层才避免报错。证明了 // p = &a; a 的类型不同与 &a; */ int main(void) { unsigned int*a[5] = {(unsigned int*)0x11111111,(unsigned int*)0x11111112,(unsigned int*)0x11111113,(unsigned int*)0x11111114,(unsigned int*)0x11111115}; a[5] = (unsigned int*)0x11111116; unsigned int*(*p)[5]; // p是指针数组指针, 写的对吧?应该没错。 p = &a; // p = a; 报警告 printf("*(p+1)=%p \n", (*(*(p+1)))); // 解引用2层才避免报错 printf("*(a+1)=%p \n", (*(a+1))); // 解引用1层即可避免报错 printf("*(a+5)=%p \n", (*(a+5))); } // 觉得这里应该打印相同值 //这里(*(a+5))应该等于(*(*(p+1))). 其实我就是想实现数组越界访问。 这里实验,在指针数组指针上, 。 实验三 // 这个基本的要先搞定,比上面那个实验简单。 int main(void) { unsigned int a[5] = {0}; a[5] = 99; unsigned int(*p)[5]; p = &a; printf("&a[5]=%p \n", &a[5]); printf("*(p+1)=%p \n", (*(p+1))); printf("*(*(p+1))=%d \n", *(*(p+1))); printf("((unsigned int*)(*(p+1)))[0]=%d \n", ((*(p+1)))[0] ); printf("*((unsigned int*)(*(p+1))) =%d \n", *((*(p+1))) ); }
版权声明:本文为happybirthdaytoyou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。