请问这个C语言程序阅读题是怎么分析的得到结果的,谢谢
2个回答
展开全部
数组名x写错了,应该是a。p指向a的第一个元素,顺序遍历而打印出每一个值,没什么好讲的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个连题目都应错了,真的无语。
数组名字是a吧,定义的时候用x定义的?
然后就是定义的i变量,根本没用啊,挺奇怪的。
这题目不难啊,只要是几个细节,初学者非常容易犯错的地方,数组就不用讲了,没什么好讲的吧,按题目上的表示是X是一个数组,[3]表示数组的容量,数组名X前面的int是类型,是数组内存放的东西的类型说明,数组就像一个货架,但是只能放同一种类型的货架,数字制定货架的大小,类型符表明这个货架,能放哪种类型的东西。
后面的*p,表示p这个标识符是一个指针,标识符p前面的*号一定要加,当然,这是在定义的时候用的,其他语句是不用的,因为要区分变量p和指针p,比如:
我在一个程序中定义两个变量,一个是真int型变量,一个是指针。
那我能这样定义吗?
int p,s=&p;
答案是不能,因为编译器很笨,虽然我们判断s应该是一个指针,因为他初始化了,而且用的是变量的地址,p应该是变量。但是万一,我都没初始化呢?你没办法区分,电脑更没办法区分,那么最简单的就是加个符号,所以我们用*还区分,变量,有*的变量是指针,没有*号的是普通变量,而且一定你申明了,编译器会记录下来,当你后面使用的时候,如果给指针附值,那么编译器会知道,它是指针,不能赋值,只能给地址,帮你很好的找出错误。
至于变量i,没用,我就不说什么了。
然后是p=a;这里有一些坑是初学者容易犯的,p已经定义为指针了,所以我们用的时候,不用加*号,编译器自己认得,所以我们是给指针p赋地址,因为指针只能赋地址,所以右边一定是地址,但是右边没有去地址符,只能判断a是一个数组,因为在C语言等语言里,数组的名字就是地址,这个地址是数组里第一个元素的地址,比如p=a;它的意思是把数组a的第一个元素的地址给指针p,但是定义的时候,没有数组a,只有数组x,所以程序写错了,但是执行结果来看,a就是x,所以实际p=a;和p=&a[0];的效果是一样的,但是a[0]是int型变量,不是数组名,所以要&这个取地址符,而a是数组名,数组名本身就是默认地址,地址是不能再去地址的,只能直接赋值。
然后是for循环,没什么可讲的,书上都有,按照for循环的规则写,就行,第一个参数是初始化的语句,没有初始化,可以不用写,但是要保留分号,说明这里有条空语句,初始化,什么也不做,第二个判断语句,跟while等判断语句是一样的,最后是一个再次循环要做的哪些操作的语句,没有也可以不用写,关键就在于这个判断,p<a+3;对初学者,会有点难理解,首先,他们是地址比较,指针就是地址,不是数,如果是数,那么可以对数进行加减乘除等操作,而地址没有这么多操作,地址有的操作,比如:地址可以加减,地址相当于门牌号,门牌号可以加或者减,比如你家门牌号是100,那么门牌号+1,就变成了101,那就是你隔壁邻居的地址,它是有意义的,减也一样的,指针可以++,--;因为++等同于+1嘛,--也是同理,但是地址不能乘除,地址乘除没有意义,比如门牌号100,你把门牌号*3,是没有意义的,是不允许的,你说100*3,不是300吗?可以表示门牌号是300的邻居啊,那我问你,如果允许门牌号乘,那么就要允许门牌号可以除,那你把门牌号除3,它有意义吗?没有,而且不一定能除的断,但是+,-一定是整数,他们一定具有意义,而且指针只支持整数加减,不支持float等类型。那p<a+3;是什么意思呢?很简单,这就是个门牌号的比较,门牌号是可以比较的,p的地址是不是小于a+3的地址?是,那么就for循环,要不然就退出。p++就是p=p+1;但是他们不一定是相差一个数的,因为在计算机里,指针是内存的地址,是内存的门牌号,他们不一定差1,比如int型,一般的电脑int都是4个字节为一个单位的,所以p=p+1;后,一般p和前面的p是相差四个单位的,相当于一个家庭占用了4个门牌号,但是你直接写p++;或者p=p+1就好了,编译器自己会去处理,当编译器发现++,--的对象是指针的时候,他们会帮你处理好,你直接用就行,所以一直比较,p的地址小,就一直加,相当于往数组的后一个变量移动一位,直到移除数组,a+3其实是数组的最后一位的下一位,a+3已经越界了,但是我们没有使用这个地址,所以不用出现错误,如果你用这个地址,你就会出错的,这就是为什么很多不喜欢C语言的原因,因为用指针的话,要自己去进行边界检查,否则会出现很多错误,C++里有容器,容器里有使用迭代器,迭代器有强制边界检查的东西。
最后是一个标准输出,不用讲吧,这个一开始学C语言,就在用的,格式对了,就没问题了,只是这里面用的*P,不是P,这里还是讲一下吧,如果你的变量写p,那么会输出p的值,也就是地址,因为p本身就是一个存放地址,如果你要显示,它就显示p存放的数字,就是显示地址,同理,如果有一个int a=10;这个变量a的值是10,意思是10这个数是放在变量a里面的,所以取的时候,直接去a存放的数字10,不是取a的地址,去a的地址,要用&取地址符,这样才会去地址,不去取存放的东西,p是一个指针,p是存放地址的,不是存放数字的,所以直接用p就去了p存放的东西,即地址,如果用&去地址符的话,那么显示的就是指针p的地址,但是我们想显示都不是这些,我们是想显示,取出p存放的地址所对应的变量存放的东西,要用到解地址符*,现在这里的*不是表示p是一个指针了,表示p是一个指针的操作符,只用在定义的时候,如int *p;其他地方都是解地址符,解地址符的意思就是,取出这个变量存放的东西,把这个变量存放的东西取出来之后,当做地址,按这个地址找到对应的内存,取出这个内存里存放的数字,也就是对应的数组元素里存放的数字了。
我讲的应该很细了,希望能看懂,不懂再问吧。
数组名字是a吧,定义的时候用x定义的?
然后就是定义的i变量,根本没用啊,挺奇怪的。
这题目不难啊,只要是几个细节,初学者非常容易犯错的地方,数组就不用讲了,没什么好讲的吧,按题目上的表示是X是一个数组,[3]表示数组的容量,数组名X前面的int是类型,是数组内存放的东西的类型说明,数组就像一个货架,但是只能放同一种类型的货架,数字制定货架的大小,类型符表明这个货架,能放哪种类型的东西。
后面的*p,表示p这个标识符是一个指针,标识符p前面的*号一定要加,当然,这是在定义的时候用的,其他语句是不用的,因为要区分变量p和指针p,比如:
我在一个程序中定义两个变量,一个是真int型变量,一个是指针。
那我能这样定义吗?
int p,s=&p;
答案是不能,因为编译器很笨,虽然我们判断s应该是一个指针,因为他初始化了,而且用的是变量的地址,p应该是变量。但是万一,我都没初始化呢?你没办法区分,电脑更没办法区分,那么最简单的就是加个符号,所以我们用*还区分,变量,有*的变量是指针,没有*号的是普通变量,而且一定你申明了,编译器会记录下来,当你后面使用的时候,如果给指针附值,那么编译器会知道,它是指针,不能赋值,只能给地址,帮你很好的找出错误。
至于变量i,没用,我就不说什么了。
然后是p=a;这里有一些坑是初学者容易犯的,p已经定义为指针了,所以我们用的时候,不用加*号,编译器自己认得,所以我们是给指针p赋地址,因为指针只能赋地址,所以右边一定是地址,但是右边没有去地址符,只能判断a是一个数组,因为在C语言等语言里,数组的名字就是地址,这个地址是数组里第一个元素的地址,比如p=a;它的意思是把数组a的第一个元素的地址给指针p,但是定义的时候,没有数组a,只有数组x,所以程序写错了,但是执行结果来看,a就是x,所以实际p=a;和p=&a[0];的效果是一样的,但是a[0]是int型变量,不是数组名,所以要&这个取地址符,而a是数组名,数组名本身就是默认地址,地址是不能再去地址的,只能直接赋值。
然后是for循环,没什么可讲的,书上都有,按照for循环的规则写,就行,第一个参数是初始化的语句,没有初始化,可以不用写,但是要保留分号,说明这里有条空语句,初始化,什么也不做,第二个判断语句,跟while等判断语句是一样的,最后是一个再次循环要做的哪些操作的语句,没有也可以不用写,关键就在于这个判断,p<a+3;对初学者,会有点难理解,首先,他们是地址比较,指针就是地址,不是数,如果是数,那么可以对数进行加减乘除等操作,而地址没有这么多操作,地址有的操作,比如:地址可以加减,地址相当于门牌号,门牌号可以加或者减,比如你家门牌号是100,那么门牌号+1,就变成了101,那就是你隔壁邻居的地址,它是有意义的,减也一样的,指针可以++,--;因为++等同于+1嘛,--也是同理,但是地址不能乘除,地址乘除没有意义,比如门牌号100,你把门牌号*3,是没有意义的,是不允许的,你说100*3,不是300吗?可以表示门牌号是300的邻居啊,那我问你,如果允许门牌号乘,那么就要允许门牌号可以除,那你把门牌号除3,它有意义吗?没有,而且不一定能除的断,但是+,-一定是整数,他们一定具有意义,而且指针只支持整数加减,不支持float等类型。那p<a+3;是什么意思呢?很简单,这就是个门牌号的比较,门牌号是可以比较的,p的地址是不是小于a+3的地址?是,那么就for循环,要不然就退出。p++就是p=p+1;但是他们不一定是相差一个数的,因为在计算机里,指针是内存的地址,是内存的门牌号,他们不一定差1,比如int型,一般的电脑int都是4个字节为一个单位的,所以p=p+1;后,一般p和前面的p是相差四个单位的,相当于一个家庭占用了4个门牌号,但是你直接写p++;或者p=p+1就好了,编译器自己会去处理,当编译器发现++,--的对象是指针的时候,他们会帮你处理好,你直接用就行,所以一直比较,p的地址小,就一直加,相当于往数组的后一个变量移动一位,直到移除数组,a+3其实是数组的最后一位的下一位,a+3已经越界了,但是我们没有使用这个地址,所以不用出现错误,如果你用这个地址,你就会出错的,这就是为什么很多不喜欢C语言的原因,因为用指针的话,要自己去进行边界检查,否则会出现很多错误,C++里有容器,容器里有使用迭代器,迭代器有强制边界检查的东西。
最后是一个标准输出,不用讲吧,这个一开始学C语言,就在用的,格式对了,就没问题了,只是这里面用的*P,不是P,这里还是讲一下吧,如果你的变量写p,那么会输出p的值,也就是地址,因为p本身就是一个存放地址,如果你要显示,它就显示p存放的数字,就是显示地址,同理,如果有一个int a=10;这个变量a的值是10,意思是10这个数是放在变量a里面的,所以取的时候,直接去a存放的数字10,不是取a的地址,去a的地址,要用&取地址符,这样才会去地址,不去取存放的东西,p是一个指针,p是存放地址的,不是存放数字的,所以直接用p就去了p存放的东西,即地址,如果用&去地址符的话,那么显示的就是指针p的地址,但是我们想显示都不是这些,我们是想显示,取出p存放的地址所对应的变量存放的东西,要用到解地址符*,现在这里的*不是表示p是一个指针了,表示p是一个指针的操作符,只用在定义的时候,如int *p;其他地方都是解地址符,解地址符的意思就是,取出这个变量存放的东西,把这个变量存放的东西取出来之后,当做地址,按这个地址找到对应的内存,取出这个内存里存放的数字,也就是对应的数组元素里存放的数字了。
我讲的应该很细了,希望能看懂,不懂再问吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询