c语言指针运算题详解,C语言指针用法详解(二) 指针的算术运算

例题1:

Question :

char a[20];

int *ptr = (int * )a;

ptr++

Practice :

c3e90248abb1666b8c37f85d6dc2c004.pngReason :

#include

using namespace std;

int main()

{

char a[20];

int *ptr = (int * )a;/// 强制类型转换不会改变a的类型

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a

***/

cout<

ptr++;

cout<< " sizeof (ptr) "<< sizeof(ptr)<

/***

** ptr 类型是指针,指针的自增,当然是增加自身的大小了

** sizeof(ptr) 为4, ptr 增加4

***/

cout<

}

ab2f39f1fdd9a25bae977c4a08f307e1.png

例题2:

Question :

int arr[20] = {0};

int *ptr = arr;

for (int i=0; i<20; i++)

{

(*ptr)++;

ptr++;

}

Practice :

928164b991bc1b7fe1caeb2d64273ac7.png

Reason :

#include

using namespace std;

int main()

{

int arr[20] = {0};

int *ptr = arr;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向 arr

***/

for (int i=0; i<20; i++)

{

(*ptr)++; /// 改变的是 ptr 指向的值

ptr++; /// 改变的是 ptr 指向的地址 ,再次验证 ptr 自增的是 sizeof(ptr)

cout<

}

}

3019f58863a7b4c581a7dbef45d692f8.png

例题3:

Question :

char a[20] ="You_are_a_girl;

int *ptr = (int *)a;

ptr += 5;

Practice:

a2a2410df5dda1b2fa7a2594be0a10d7.png

Reason

#include

using namespace std;

int main()

{

char a[20] = "You_are_a_girl";

int *ptr = (int * )a;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向 a

***/

cout<

ptr += 5;

/*** ** ptr 强制转换 指向(int), 本身的类型是 ( int * )

** ptr + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int)

** ptr 向高地址移动20个字节, 此时超出a 的合法范围(a的声明是以 char单位分配的 ), 但是语法可以

**

***/

cout<

}

31306e1017a45ed8b7814f3e155faeeb.png

例题4:

Question :

char a[20] = "You_are_a_girl";

char *p = a;

char **ptr = &p;

printf("**ptr = %c \n", **ptr);

ptr++;

printf("*ptr = %c \n", **ptr);

Practice :

Reason

#include

using namespace std;

int main()

{

char a[20] = "You_are_a_girl";

char *p = a;

char **ptr = &p;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** p 的类型是 char* , 指向的类型是 char , 指向 a

** ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p

***/

printf("**ptr = %c \n", **ptr);

/*cout<

cout<

cout<

ptr++;

cout<

cout<

/// ptr自增 ,增加的是它指向的类型的 所占字节

printf("*ptr = %c \n", **ptr);

/// 此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作

}

总结:

1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew

ptrold指针的类型 和 ptrnew指针的类型 相同

ptrold指针指向的类型 和 ptrnew指针指向的类型 相同

ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数

2.两个指针不能作加法运算,非法操作

3.两个指针可以作减法操作,但必须类型相同

吐吐吐吐吐吐吐槽: 博客园好难用。。。。。。

来源:https://www.cnblogs.com/sxy-798013203/p/7637298.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值