最近得空,看看以前的笔记, 又实验了下, 挑几个上传

 

#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 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/happybirthdaytoyou/p/8316455.html