指针进阶

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值