#include<stdio.h>
#include<stdlib.h>
int main()
{
//int a[5] = { 1, 2, 3, 4, 5 };
//int* ptr = (int*)(&a + 1);//&a的类型为int()[5] 对它加一实际上是跳过了整个数组
//printf("%d,%d", (a + 1), (ptr - 1));//a+1把a转换成了指向数组第二个元素的指针 ptr-1为数组最后一个元素的地址
//打印值为 2 5
//#################################
//int a[4] = { 1, 2, 3, 4 };
//int ptr1 = (int)(&a + 1);//指向数组末元素的下一个元素
//int ptr2 = (int*)((int)a + 1);//将数组的首元素地址强行转化为int 并且+1
//printf("%x,%x", ptr1[-1], ptr2);//ptr1[-1]相当于(ptr1-1)
// //ptr2打印的是a首元素地址加一地址上的随机值它实际上是一个野指针
//##############################################
//int a[3][2] = { (0, 1), (2, 3), (4, 5) };//逗号表达式_
//int p;
//p = a[0];//a[0]相当于*(a+0)为一个长度为2的int 类型的数组 p指向它的首元素
//printf("%d", p[0]);//1
//int a[5][5];
//int(p)[4];
//p = a;//可以赋值成功
//printf(“a_ptr=%#p,p_ptr=%#p\n”, &a[4][2], &p[4][2]);//肯定不一样啊,a是int()[5],p是int()[4]
//printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//差了-4
//int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
//int ptr1 = (int*)(&arr + 1);//arr+1跳过整个数组
//int* ptr2 = (int*)((arr + 1));//arr+1表示arr[1]ptr2这里指向了一个数组
//printf("%d,%d\n", (ptr1 - 1), (ptr2 - 1));//打印值为10,5
//#######################################
//char a[] = { “work”,“at”,“alibaba” };//指针数组
//char* pa = a;//pa存的是"work"的地址的地址
//pa++;//pa++跳过一个char
//printf("%s", pa);//对pa进行解引用可以得到at的首元素地址按照%s打印当然就是at了
//char c[] = { “ENTER”,“NEW”,“POINT”,“FIRST” };//指针数组
//char** cp[] = { c + 3,c + 2,c + 1,c };//二维指针数组分别存的是c中指针的指针
//char*** cpp = cp;//存的是二维指针数组的首元素指针
//printf("%s\n", **++cpp);//++和*是同级从右向左便可得到point
//printf("%s\n", *-- * ++cpp + 3);//这里要注意上一步执行过++后的cpp指向的是cp中第二个元素的地址 得到er
//printf("%s\n", *cpp[-2] + 3);//得到st
//printf("%s\n", cpp[-1][-1] + 1);//得到 ew
return 0;
}
指针进阶
最新推荐文章于 2022-05-07 10:04:49 发布