指针使用(三)指针的算术运算-指针加法

#include <stdio.h>

int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=arr;
*p=10;
p++;
*p=20;
printf("%d\n",arr[0],arr[1]);
return 0;

}

问:输出结果为什么???指针p++;是一下那种情况

1、加一个字符数组的长度

2、加一个字节的长度

3、加一个单元格的长度

分析:

1、程序员需要指针p++所产生的作用:程序员需要通过指针p++来改变数组中数组的值,而不是通过指针p++创建一个新的数组并添加在原数组后,

2、边界问题:当数组大小规定,如过使用指针p++来加一个字符数组的长度,会产生越界问题,使数组队列溢出而使程序崩溃

因此,忽略问题1,验证问题2、问题3,查看指针如何使用,会使指针指向数组中的格子,而改变数组的值

验证:

问题1、

#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};                    //定义一个数组arr,规定大小为十个格子
int *p = arr;                                                      //定义一个指针p指向arr数组(数组arr的首地址)
*p = 10;                                                           //将10赋值给指针p,即将数组arr的首地址(第一个格子)的值从1更改为10
p = (int *)((int)p+1);                                        //该操作为指针p向后移一个字节
*p = 20;                                                           //将指针移动后的地址所对应的值更改为20
printf("%d,%08x\n",arr[0],arr[1]);                    //输出数组arr的第一个值和第二个值
return 0;

}                                                                              //输出结果为5130、00000000

分析:为改变数组arr[0]、arr[1]中的值,定义指针p,使指针p向后一个字节发现,数组arr的第一个值和第二个值并未按预计想法赋值成为10、20,因此得出指针p++仅使指针向后移动一个格子(int型指针大小为四个字节),即四个字节,

#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = arr;
*p = 10;
p++;
*p = 20;
printf("%d,%08d\n",arr[0],arr[1]);
return 0;

}                                                                                //程序输出结果为10、20

 

结论:

指针加法,加一个单元格大小,

指针减法,需要调整,调整的权重为sizeof(指针去掉一个*)

int main()
{
int *p1 = (int *)2000;
printf("%d\n",p1+4);


int arr[10] = {1,2,3};
int *p = arr;                                                //int
*p = 10;
p++;                                                           //加一个int单元格,4字节
*p = 20;

double brr[5] = {12.3,34.5,56.7};
double *dp = brr;                                       //double
dp++;                                                         //加一个单元格,8字节
*dp = 100;

char crr[5] = "abc";
char *cp = crr;                                           //char
cp++;                                                        //加一个单元格,1字节
*cp = 'x';
return 0;

}

例题:

int main()
{
int *p = (int *)2000;
printf("%d\n",p+4);                                          //int型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(short *)p+4);                             //short型,二个字节大小,2000+4*2,输出结果为:2008
printf("%d\n",(double *)p+4);                          //double型,八个字节大小,2000+4*8,输出结果为:2032
printf("%d\n",(float **)p+4);                            //float**,指针型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(unsigned short *)p+4);            //无符号short 型,两个字节大小,2000+4*2,输出结果为:2008
printf("%d\n",(long *)p+4);                             //long型,四个字节大小,2000+4*4,输出结果为:2016
printf("%d\n",(char *)p+4);                             //char型,一个字节大小,2000+4*1,输出结果为:2004
printf("%d\n",(unsigned long long)p+4);      //无符号长长整型,常量,一个字节大小,2000+4*1,输出结果为:2004
return 0;

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值