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

例题1:

Question :

char a[20];

int *ptr = (int * )a;

ptr++

Practice :

7ec275b8f6e27c58a0bef8bc84220941.png

Reason :

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

}

7243c216e84c9ef50c292eb8cc55bb8c.png

例题2:

Question :

int arr[20] = {0};

int *ptr = arr;

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

{

(*ptr)++;

ptr++;

}

Practice :

5461b74c60d76a524462b388a0b9533f.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<

}

}

f0c834f5d15eef75b2247248ba2ba605.png

例题3:

Question :

char a[20] ="You_are_a_girl;

int *ptr = (int *)a;

ptr += 5;

Practice:

d9c673a927c766e80ebb31974f4dee49.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 + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int)

** ptr 向高地址移动20个字节, 此时超出a 的合法范围, 但是语法可以

** 我也不懂 这里为什么超出 a 的合法范围 ????求教

***/

cout<

}

c04ddc061f5e159194cb022a770ce59e.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.两个指针可以作减法操作,但必须类型相同

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值