C语言指针问题快速解惑.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

1、

inta[3]={2,5,8};

int*p=a;

把数组名赋值给指针表示将数组的首元素的地址赋予此指针。

2、

inta[3]={2,5,8};

int*p=a[0];

a[0]是a数组的首元素,而则是取地址运算符,所以“a*0+”取得的同样是a数组的首元素的地址,因此这段代码的含义和代码段是一致的。

3、

char*c1=Hello;charc2[6]=World;

这两句不都是声明一个字符串吗?有什么区别吗?

Hello是一个字符串,然后让char指针c1指向这个字符串的首元素的地址。

第二句是声明一个长度为6的char类型数组,并且设置数组的初始值为World。注意末尾还有一个隐藏的“\0”,所以长度是6,而不是5。

4、数组指针的加减运算

对于指向数组的指针变量可以进行加减运算,比如对于指向数组的指针p,p++、p--、p+2等都是合法的。这里的加减运算并不是针对数组元素的,而是针对指针位置的,比如p当前指在首元素上,那么p++后就指在第二个元素上;比如p当前指在第5个元素上,那么p=p-2后,p就指在第3个元素上。

例子:

char*c1=Hello;printf(%c\n,*c1);//输出Hc1++;

printf(%c\n,*c1);//输出e5、指针之间的运算

两个指针之间可以进行减法运算,只有指向同一个数组的两个指针之间进行减法运算才有意义,而指向不同数组的两个指针之间进行减法运算则没有意义。为什么呢?

指针其实就是内存中的地址,两个指针的减法运算计算的就是两个内存地址之间的元素的个数,比如整数指针p1指向内存地址2008H,整数指针p2内存地址2000H,而整数占4个字节,所以p1-p2的结果就是(2008H-2000H)/4=2,也就是p1和p2之间相差2个元素。很显然两个指针进行加法运算或者两个指向不同变量的指针进行减法运算都是没有意义的。例子:

inta1[5]={3,5,6,8,2};

int*p1=a1;//p1是指向第0个元素的地址

int*p2=a1[3];//p2指向的是第3个元素的地址

p1++;//p1指向了第1个元素

printf(%d,p2-p1);//输出26、指针之间的大小比较

指向同一个数组的两个指针之间进行大小的比较是有意义的。比较结果为地址高低的比较:例子:

inta1[5]={3,5,6,8,2};

int*p1=a1;

int*p2=a1[3];p1++;

printf(%d\n,p2p1);//输出0,因为p2的地址比p1高2位

p1=p1+2;//p1在数组内向高位移动两位printf(%d\n,p2==p1);//输出1,因为p1和p2的位相等

7、数组做为参数传递给函数

可以将数组做为传递给函数,比如下面的代码就是将传入输入的每个元素乘以2:voidmakeDoule(intarr[],intlen)

{

inti=0;for(i=0;ilen;i++)

{

arr[i]=arr[i]*2;

}

}

intmain(intargc,char*argv[])

{

inta1[5]={3,5,6,8,2};

inti=0;

intlen=sizeof(a1)/sizeof(int);makeDoule(a1,len);for(i=0;ilen;i++)

{

printf(%d,a1[i]);

}

}

运行结果:

61012164传递给makeDoule函数的是a1,我们知道,一个数组的名字其实就是指向数组首元素的地址。所以makeDoule函数得到的arr就是数组a1的指针,那么在函数内部对arr进行操作的话就会改变a1数组。

所以makeDoule函数也可以写成下面的样子,这两个函数是等价的:voidmakeDoule(int*arr,intlen)

{

inti=0;for(i=0;ilen;i++)

{

arr[i]=arr[i]*2;

}

}

当然写成下面的形式更符合指针的使用习惯,因此推荐这种用法:

voidmakeDoule(int*arr)

{

inti=0;for(i=0;i5;i++)

{

//arr+i指向的值设置为arr+i指向的值的二倍。

*(arr+i)=*(arr+i)*2;

}

}

有的同学可能会问,为什么makeDoule函数还需要传递数组的长度len呢?makeDoule函数这

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档