我想问一个关于c语言函数指针指针的问题

关于C语言指针的问题_百度知道
关于C语言指针的问题
指针P得到alloc函数返回数组allocbuf第四个空间的地址。利用strcpy函数,allocbuf数组由abcdefg改变成abcdHelloWorld。为什么把【strcpy(p,s)】改变成【P=&HelloWorld&】,allocbuf数组则不会发生改变。指针P中不应该是allocbuf数组第四个空间的地址吗?
我有更好的答案
知道P=&HelloWorld&的确切意思吗?它的意思是“创建一个常字符串HelloWorld,并把第一个字符的地址赋给指针变量p”。既然是“常字符串”,它能改变吗?
采纳率:75%
第一种写法表示定义一个指向double的指针,a1所指向的内容不允许通过a1去改变,第二种写法语法上就是错误的。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c语言,为什么选b,14.下列关于指针定义的描述,_____b______是错误的.A.指针是一种变量,该变量用来存放某
c语言,为什么选b,14.下列关于指针定义的描述,_____b______是错误的.A.指针是一种变量,该变量用来存放某个变量的地址值的.B.指针变量的类型与它所指向的变量类型一致.C.指针变量的命名规则与标识符相同.D.在定义指针时,标识符前的“*”号表示后面的指针变量所指向的内容.
int a, *b = &a;在这个语句中,a是一个变量,它的类型是int,b是一个指向了a的指针,它的类型是( int * ),明显的,int 不等于( int * ),所以类型不一样啊,当然,不排除有一样的情况,但是这个题是找错误的,只要有一个反例就可以证伪,所以选B了
我有更好的回答:
剩余:2000字
与《c语言,为什么选b,14.下列关于指针定义的描述,_____b______是错误的.A.指针是一种变量,该变量用来存放某》相关的作业问题
B和DB就不多说了,如果类型一致,sizeof的结果也要一致,但指向数据结构的指针基本不符合这个结论D说的是定义指针的时候.定义的时候“*”仅代表这个变量是指针类型,不取指针指向的内容,只有在引用的时候,“*”才表示获取指针指向的内容.31.A和D只要是变量,都可以对变量进行"&"取地址操作,D选项y是个数组变量,y和
1.请用简洁的语言概述选文写了一个什么样的故事?答:写卡尔在祖母和老人的巧妙教育下,改掉了坏毛病2.选文标题中“出售欲望”的意思是什么?答:出售欲望”指卡尔将抢钱偷钱的想法出卖给人,就没有了这种权利,以后再抢钱偷钱就是侵权.3.选文在艺术表现手法上巧妙设置悬念,请从文中找出来,并说说产生了怎样的表达效果?答:祖母早就知
有九种翻译: 精彩资讯 ·香港大陆合力推出行政文秘专业培训教程 ·让你的个性在职场中张扬 让女人味走开·“史上最牛女秘书”PK老板 职业安全感·在跳槽滋味中成长 盘活职场人脉关系 静夜思 李白 床前明月光,疑是地上霜. 举头望明月,低头思故乡. 1).In the Still of the Night I descry
电视遥控是利用红外线来工作的,夜视仪用到的是红外线,非接触式体温计也是用到红外线,因不同温度红外线程度不同;因为紫外线能使荧光物质发光,比如:验钞机是利用紫外线来工作的;X射线具有较强的穿透能力,因此可以用来医院透视;故答案为:√;×;√;√.
A.A=B+C与B+C=A两个反应吸收和放出的热量相等,故A错误; B.A=B+C是吸热反应,故B错误;C.A具有的能量低于B和C具有的能量总和,故C错误;D.A=B+C是吸热反应,B+C=A必然是放热反应,B+C=A是A=B+C的逆过程,故D正确.故选D.
%按照题目意思,数列的偶数项为前后奇数项的和%数列的偶数项的和正好是数列奇数项的和的两倍%而偶数项和奇数项的和就是数列所有元素的和等于105%所以奇数项和是35,偶数项和是70a=nchoosek(1:14,7);%从14个数中选取7个数b=a(sum(a,2)==35,:);%选出满足和为35的组合,是奇数项7个的所
1.“我”成绩非常不理想,不想读下去。2.(1)“攀”字表现了山的陡峭,突出了爬山的艰难;  (2)“屹立”突出了这句话在“我”心中的重要地位或产生的重大影响。 3.(1)有信心和勇气就能克服困难; & (2)把大困难分解为小因难,逐步解决。4.例:文中父亲关爱儿子成长。儿子成绩不好想辍学,父亲通过爬山让儿子
立春过后,大地渐渐从沉睡中(1)(A清醒;B苏醒;C醒悟;D复苏)过来.冰雪融化,草木萌发,各种花(2)(A次第;B连续;C陆续;D全部)开放.再过两个月,燕子翩然归来.不久,布谷鸟也来了.于是转入炎热的夏季,这是植物孕育果实的时期.到了秋天,果实成熟,植物的叶子渐渐变黄,在秋风中(3)(A纷纷;B刷刷;C簌簌)地落下
C淡水即含盐量小于0.5 g/L的水.地球上水的总量为14亿立方千米,地球上的水很多,淡水储量仅占全球总水量的2.53%,而且其中的68.7%又属于固体冰川,分布在难以利用的高山和南、北两极地区,还有一部分淡水埋藏于地下很深的地方,很难进行开采.
选B汇编写的源代码还是要编译.比如宏汇编需要MASM.EXE LINK.EXE DEBUG.EXE
胶体以整体来看的时候一定是电中性的,只是胶体以微粒形式来看是才由于对电子的吸引或排斥而带电.故B是错的,任何胶体都不带电;D对,当通电时,胶体微粒才在直流电的作用下产生定向运动而体现出微粒的带电性
A、动能不变,势能减小,错误,动能减小.B、动能减小,势能减小,正确.C、动能减小,机械能不变,错误,机械能也减小.D、动能不变,势能增大.错误,势能减小.故选B.
解题思路: 根据选项中涉及到的SO2、氧化铝等的性质进行分析解题过程: 分析: A:SO2或者它与水反应生成的H2SO3可以使细菌体内的蛋白质*,从而杀死细菌。 亚硫酸盐不一定有毒有毒,但是二氧化硫有毒,所以不能用二氧化硫加工食品。 二氧化硫对食品有漂白和防腐作用,使用二氧化硫能够达到使产品外观光亮、洁白的效果,是食品
汶川位于我国四川省,位于阿尔卑斯-喜马拉雅地震带上;该省东邻重庆,重庆市的简称是渝.根据题意.故选:A.
题干中白糖属于糖类;牛奶富含蛋白质,钾和钙是无机盐,饮料的重要重要成分是水分,所以不能提供的营养素是维生素.故选B
1.C 2.D 3.B 4.A
答案一20、父母外出打工,他哭干眼泪;挨别的孩子打,昂着头(或倔),不让眼泪落下来;父母打工回家受伤,他像没事人一样,不哭;父母决定不再外出打工,他获得了父母的温暖(爱),终于掉下眼泪21、“头疼”:烦恼、苦恼;头疼的事情:上课不认真课;和别人打架;性情冷漠,不愿意和老师沟通.22、描写方法:神态描写或动作描写;心理:
十进制到二进制,再二进制到10进制输出有截断误差.#include main(){int i,n;scanf("%d",&n);for (i=0;i
粤语啊,在香港生活,粤语是必须会的,而英语就算不会也没关系,只有出国才要用到粤语不过只会一种语言似乎不太对,应该是两种才对,就算楼主你,你会普通话,还有家乡话.C语言指针与数组之间的恩恩怨怨_C语言中文网
&&C语言辅导班&&&&
&&C++辅导班&&&&
&&算法/数据结构辅导班&&&&
读者QQ交流群:loading...
&&/&&&&/&&&&/&&
很多初学者弄不清指针和数组到底有什么样的关系。我现在就告诉你:他们之间没有任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。
指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。
数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但不能存函数。
既然它们之间没有任何关系,那为何很多人把数组和指针混淆呢?甚至很多人认为指针和数组是一样的。这就与市面上的C 语言的书有关,几乎没有一本书把这个问题讲透彻,讲明白了。
一、以指针的形式访问和以下标的形式访问
下面我们就详细讨论讨论它们之间似是而非的一些特点。例如,函数内部有如下定义:
char *p = &abcdef&;
char a[] = &123456&;
1、以指针的形式访问和以下标的形式访问指针
例子A)定义了一个指针变量p,p 本身在栈上占4 个byte,p 里存储的是一块内存的首地址。这块内存在静态区,其空间大小为7 个byte,这块内存也没有名字。对这块内存的访问完全是匿名的访问。比如现在需要读取字符&e&,我们有两种方式:
以指针的形式:*(p+4)。先取出p 里存储的地址值,假设为0x0000FF00,然后加上4 个字符的偏移量,得到新的地址0x0000FF04。然后取出0x0000FF04 地址上的值。
以下标的形式:p[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操作。p[4]这个操作会被解析成:先取出p 里存储的地址值,然后加上中括号中4 个元素的偏移量,计算出新的地址,然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了。
2、以指针的形式访问和以下标的形式访问数组
例子B)定义了一个数组a,a 拥有7 个char 类型的元素,其空间大小为7。数组a 本身在栈上面。对a 的元素的访问必须先根据数组的名字a 找到数组首元素的首地址,然后根据偏移量找到相应的值。这是一种典型的&具名+匿名&访问。比如现在需要读取字符&5&,我们有两种方式:
以指针的形式:*(a+4)。a 这时候代表的是数组首元素的首地址,假设为0x0000FF00,然后加上4 个字符的偏移量,得到新的地址0x0000FF04。然后取出0x0000FF04 地址上的值。
以下标的形式:a[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操作。a[4]这个操作会被解析成:a 作为数组首元素的首地址,然后加上中括号中4 个元素的偏移量,计算出新的地址,然后从新的地址中取出值。
由上面的分析,我们可以看到,指针和数组根本就是两个完全不一样的东西。只是它们都可以&以指针形式&或&以下标形式&进行访问。一个是完全的匿名访问,一个是典型的具名+匿名访问。一定要注意的是这个&以XXX 的形式的访问&这种表达方式。
另外一个需要强调的是:上面所说的偏移量4 代表的是4 个元素,而不是4 个byte。只不过这里刚好是char 类型数据1 个字符的大小就为1 个byte。记住这个偏移量的单位是元素的个数而不是byte 数,在计算新地址时千万别弄错了。
二、a 和&a 的区别
通过上面的分析,相信你已经明白数组和指针的访问方式了,下面再看这个例子:
& &int a[5]={1,2,3,4,5};
& &int *ptr=(int *)(&a+1);
& &printf(&%d,%d&,*(a+1),*(ptr-1));
打印出来的值为多少呢? 这里主要是考查关于指针加减操作的理解。
对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所以,一个类型为T 的指针的移动,以sizeof(T) 为移动单位。因此,对上题来说,a 是一个一维数组,数组中有5 个元素; ptr 是一个int 型的指针。
&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一个数组的首地址。所以输出2*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,输出5。
这些分析我相信大家都能理解,但是在授课时,学生向我提出了如下问题:在Visual C++6.0 的Watch 窗口中&a+1 的值怎么会是(x0012ff6d(0x)呢?
上图是在Visual C++6.0 调试本函数时的截图。
a 在这里代表是的数组首元素的地址即a[0]的首地址,其值为0x0012ff6c。
&a 代表的是数组的首地址,其值为0x0012ff6c。
a+1 的值是0x*sizeof(int),等于0x0012ff70。
问题就是&a+1 的值怎么会是(x0012ff6d(0x)呢?
按照我们上面的分析应该为0x*sizeof(int)。其实很好理解。当你把&a+1放到Watch 窗口中观察其值时,表达式&a+1 已经脱离其上下文环境,编译器就很简单的把它解析为&a 的值然后加上1byte。而a+1 的解析就正确,我认为这是Visual C++6.0 的一个bug。既然如此,我们怎么证明证明&a+1 的值确实为0x*sizeof(int)呢?很好办,用printf 函数打印出来。这就是我在本书前言里所说的,有的时候我们确实需要printf 函数才能解决问题。你可以试试用printf(&%x&,&a+1);打印其值,看是否为0x*sizeof(int)。注意如果你用的是printf(&%d&,&a+1);打印,那你必须在十进制和十六进制之间换算一下,不要冤枉了编译器。
另外我要强调一点:不到非不得已,尽量别使用printf 函数,它会使你养成只看结果不问为什么的习惯。比如这个列子,*(a+1)和*(ptr-1)的值完全可以通过Watch 窗口来查看。
平时初学者很喜欢用&printf(&%d,%d&,*(a+1),*(ptr-1));&这类的表达式来直接打印出值,如果发现值是正确的就欢天喜地。这个时候往往认为自己的代码没有问题,根本就不去查看其变量的值,更别说是内存和寄存器的值了。更有甚者,printf 函数打印出来的值不正确,就措手无策,举手问&老师,我这里为什么不对啊?&。长此以往就养成了很不好的习惯,只看结果,不重调试。这就是为什么同样的几年经验,有的人水平很高,而有的人水平却很低。其根本原因就在于此,往往被一些表面现象所迷惑。printf 函数打印出来的值是对的就能说明你的代码一定没问题吗?我看未必。曾经一个学生,我让其实现直接插入排序算法。很快他把函数写完了,把值用printf 函数打印出来给我看。我看其代码却发现他使用的算法本质上其实是冒泡排序,只是写得像直接插入排序罢了。等等这种情况数都数不过来,往往犯了错误还以为自己是对的。所以我平时上课之前往往会强调,不到非不得已,不允许使用printf 函数,而要自己去查看变量和内存的值。学生的这种不好的习惯也与目前市面上的教材、参考书有关,这些书甚至花大篇幅来介绍scanf 和printf 这类的函数,却几乎不讲解调试技术。甚至有的书还在讲TruboC 2.0 之类的调试器!如此教材教出来的学生质量
可想而知。
三、指针和数组的定义与声明
1、定义为数组,声明为指针
文件1 中定义如下:
& &char a[100];
文件2 中声明如下(关于extern 的用法,以及定义和声明的区别,请复习第一章):
& &extern char *a;
这里,文件1 中定义了数组a,文件2 中声明它为指针。这有什么问题吗?平时不是总说数组与指针相似,甚至可以通用吗?但是,很不幸,这是错误的。通过上面的分析我们也能明白一些,但是&革命尚未成功,同志仍需努力&。你或许还记得我上面说过的话:数组就是数组,指针就是指针,它们是完全不同的两码事!他们之间没有任何关系,只是经常穿着相似的衣服来迷惑你罢了。下面就来分析分析这个问题:
在第一章的开始,我就强调了定义和声明之间的区别,定义分配的内存,而声明没有。
定义只能出现一次,而声明可以出现多次。这里extern 告诉编译器a 这个名字已经在别的文件中被定义了,下面的代码使用的名字a 是别的文件定义的。再回顾到前面对于左值和右值的讨论,我们知道如果编译器需要某个地址(可能还需要加上偏移量)来执行某种操作的话,它就可以直接通过开锁动作(使用&*&这把钥匙)来读或者写这个地址上的内存,并不需要先去找到储存这个地址的地方。相反,对于指针而言,必须先去找到储存这个地址的地方,取出这个地址值然后对这个地址进行开锁(使用&*&这把钥匙)。如下图:
这就是为什么extern char a[]与extern char a[100]等价的原因。因为这只是声明,不分配空间,所以编译器无需知道这个数组有多少个元素。这两个声明都告诉编译器a 是在别的文件中被定义的一个数组,a 同时代表着数组a 的首元素的首地址,也就是这块内存的起始地址。数组内地任何元素的的地址都只需要知道这个地址就可以计算出来。
但是,当你声明为extern char *a 时,编译器理所当然的认为a 是一个指针变量,在32 位系统下,占4 个byte。这4 个byte 里保存了一个地址,这个地址上存的是字符类型数据。虽然在文件1 中,编译器知道a 是一个数组,但是在文件2 中,编译器并不知道这点。大多数编译器是按文件分别编译的,编译器只按照本文件中声明的类型来处理。所以,虽然a 实际大小为100 个byte,但是在文件2 中,编译器认为a 只占4 个byte。
我们说过,编译器会把存在指针变量中的任何数据当作地址来处理。所以,如果需要访问这些字符类型数据,我们必须先从指针变量a 中取出其保存的地址。如下图:
2、定义为指针,声明为数组
显然,按照上面的分析,我们把文件1 中定义的数组在文件2 中声明为指针会发生错误。
同样的,如果在文件1 中定义为指针,而在文件中声明为数组也会发生错误:
& &char *p = &abcdefg&;
& &extern char p[];
在文件1 中,编译器分配4 个byte 空间,并命名为p。同时p 里保存了字符串常量&abcdefg&的首字符的首地址。这个字符串常量本身保存在内存的静态区,其内容不可更改。在文件2中,编译器认为p 是一个数组,其大小为4 个byte,数组内保存的是char 类型的数据。在文件2 中使用p 的过程如下图:
通过上面的分析,相信你已经知道数组与指针的的确确是两码事了。他们之间是不可以混淆的,但是我们可以&以XXXX 的形式&访问数组的元素或指针指向的内容。以后一定要确认你的代码在一个地方定义为指针,在别的地方也只能声明为指针;在一个的地方定义为数组,在别的地方也只能声明为数组。切记不可混淆。下面再用一个表来总结一下指针和数组的特性:
编程帮,一个分享编程知识的公众号。跟着一起学习,每天都有进步。
通俗易懂,深入浅出,一篇文章只讲一个知识点。
文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
文章不涉及代码,不烧脑细胞,人人都可以学习。
当你决定关注「编程帮」,你已然超越了90%的程序员!
微信扫描二维码关注
本站精品教程
loading...
验证消息:严长生在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
C语言指针问题
下面代码为什么第二个数字是5呢?
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
NSLog(@"%d,%d", *(a+1), *(p-1));
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
&a得出来的是指向数组的指针,所以&a+1其实是以数组的长度为单位来移动的。如果你只是想要得到数组的第二个元素的话,那么就用*(&a[0]+1),因为&a[0]的数据类型是int*。画个图先:
假设有以下数组
int a[5] = {1,2,3,4,5};
int *x = &a+1;
虽然上面的程序可以编译通过,但是,编译器会出警告,因为x和a的类型不匹配,要想把警告去掉,有两种方法
1、通过强制类型转换
int *x = (int *)(&a+1);
print("%d\n",*(x-1));
2、为它寻找合适的类型 &a的类型是int (*)[5]
int (*x)[5] = &a+1;
printf("%d\n",**(x-1));
这里就牵涉到了如何写出适当的数据类型,这在赋值和参数传递中很重要!
所以,首先我得总结一下a,&a和&a[0]这三个数据的数据类型
a是数组名,是指向数组第一个元素的指针,毫无疑问,在这里,数组第一个元素的数据类型是int所以a的数据类型是就是int*。
&a是对一个一维数组取地址,得出来的是指向数组的指针(在这里是pointer to array of int), 也就是int(*)[5]。
&a[0]就很简单,首先a[0]得到的是一个整形数int,然后对它取地址,所以它的数据类型就是int*。
知道了数据类型,那么对指针运算看起来就清晰多了!
先看看通过强制类型转换的那部分代码,它会输出什么数字呢?
通过刚才对数据类型的总结可以知道,&a的数据类型是int (*)[5],所以&a+1其实是已经移动了5*sizeof(int)个字节了
现在指针是指到了数组最后一个元素的后一个元素(图1),也就是说,已经越界了!但是因为x的数据类型其实是int *
所以对于x-1,其实是向左移动了1*sizeof(int)个字节,也就是指向了最后一个元素,所以*(x-1)得出来的
值就是数组的最后一个元素:5
好了,现在再看第二部分,它又会输出什么数字呢?先不说答案,刚才也说了,在这里
x的数据类型是int (*)[5],是一个指向含有5个int元素的一维数组的指针,对它进行加减运算的话就会以
sizeof(int)*5个字节为单位进行移动,所以x-1其实是向左移动了sizeof(int)*5个字节,在我的机器上是移动了
20个字节,也就是回到了数组的第一个元素,所以得出来的答案就是:1
以上是一维数组的,下面我想说说二维数组的情况,有以下一段代码:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
?? = // int (*b)[3] =
?? = a[0]; // int *c = a[0];
?? = a[0][0] // int d = a[0][0];
?? = &a; // int (*e)[3][3] = &a;
?? &a[0]; // int (*f)[3] = &a[0]
?? &a[0][0]; // int *g = &a[0][0]
还是先看看a,a[0],&a,&a[0],&a[0][0]这几者的数据类型:
注意上面加粗了的文字,数组名是指向数组第一个元素的指针!
a的数据类型是??int *?不是,这句加粗了的文字的核心就是第一个元素这五个字,
a的第一个元素不就是a[0][0]吗?严格来说,不是,a的第一个元素其实是a[0],那么a[0]的数据类型是什么呢?a[0]
是一个包含三个int元素的数组,所以a[0]的类型就和int t[3]中t的类型一样,是int*,既然第一个元素 的数据类型是
int*,那把这个二维数组看成一维数组的话,实际上它就是一个含有三个int*元素的
数组,也就是指针数组,所以a的数据类型就是int (*)[3]
再来看看&a,在一维数组的时候说了,对一个数组名取地址得出来的是指向数组的指针,所以&a的数据类型 就是int (*)[3][3]
&a[0]这个看上去有点蛋疼,但是在上上段文字中也说了,a[0]是一个包含三个int元素的数组,和int t[3]
中的t的数据类型一样,是int*,自然,&a[0]的数据类型就和&t的数据类型一样,也就是int (*)[3]
到这里,二维数组中关于数据类型就写得差不多了,既然知道了数据类型,那么运算起来就可以准确知道指针会移动到哪里!
看看下面这段代码:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int (*x)[3] =
int *k = a[0];
int (*y)[3][3] = &a;
int (*q)[3] = &a[0];
int *z = &a[0][0];
printf("%d\n",(*(x+1))[0]);
printf("%d\n",*(k+1));
printf("%d\n",(*(*(y+1)))[0]);
printf("%d\n",(*(q+1))[0]);
printf("%d\n",*(z+1));
int *p = (int *)(y+1);
printf("%d\n",*(p-1));
x的数据类型是int (*)[3],所以,x+1实际上是移动了3*sizeof(int)个字节,如图所示:
k的数据类型是int *,所以,k+1实际上是移动了sizeof(int)个字节。
y的数据类型是int
(*)[3][3],所以y+1实际上是移动了3*3*sizeof(int)个字节,也就是到了数组最后一个
元素的后面的一个元素。如图所示:
q的数据类型是int (*)[3],所以,q+1实际上也是移动了3*sizeof(int)个字节。
z的数据类型是int *,所以z+1实际上是移动了sizeof(int)个字节。
所以对数组指针进行加减运算,最重要的是知道它的步长,而步长又是由数据类型决定的!
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。关于c语言指针的问题_百度知道
关于c语言指针的问题
#include &stdio.h&int main(){ int b=2,a=1; int *p=b; p=&b;//*p=b 却不行 printf(&%d\n&,*p); *p=a; printf(&%d\n&,*p); getchar(); return(0);}
*p=a也不行
我有更好的答案
第一次赋值 需要给p做初始化所以 必须是p= &a或者&bp=&a
这样写法 是对p赋值,令p指向一个空间而*p=a 这个是对*p赋值,也就是对p指向的空间赋值。 二者是不同的。 在没有做p=&b这类操作时,p没有指向任何有效内存,这是*p=a会导致程序崩溃。
谢谢·,我还想问一下,为什么*p和b都是int型为什么不行相互赋值,而且我一开始就给*p初始化了。
这样的初始化是不对的在定义 int *p时, int *是类型,p才是变量名,所以初始化赋值的同样是p而不是*p, 所以需要int *p=&b;记住 变量的初始化是给变量赋值初始值,而这里变量是p,不是*p哦
软件工程师
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 c语言指针数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信