两个c语言问题,二维数组,指针,字符串。急!!!
1.书上说:第i行第j列元素a[i][j]地址的表示方法有:a[i]+j,*(a+i)+j,&a[i][0]+j,&a[i][j]。第1,3,4种的表示方法我懂,但是第二...
1.书上说:第i行第j列元素a[i] [j]地址的表示方法有:a[i]+j,*(a+i)+j,&a[i] [0]+j,&a[i] [j]。第1,3,4种的表示方法我懂,但是第二种*(a+i)+j的表示方法我就不明白了。*(a+i)不是代表一个值吗?怎么后面还可以加上j来用作指针?两个不是一个概念呀。
2.若string表示一个字符数组或一个字符指针,则可以用:printf("%s\n'',string);表输出字符串的内容。但是string要是一个字符指针的话,那么它存放的不是字符串的首地址吗?输出的也应该是字符串的首地址,怎么能输出字符串呢? 展开
2.若string表示一个字符数组或一个字符指针,则可以用:printf("%s\n'',string);表输出字符串的内容。但是string要是一个字符指针的话,那么它存放的不是字符串的首地址吗?输出的也应该是字符串的首地址,怎么能输出字符串呢? 展开
5个回答
展开全部
1.你可以把*(a+i)+j分解为a[i]+j,就像你说的,a[i]不是应该是一个值,怎么加还可以加一个j得来用作一个数的表示一样。这就说明一个道理,不论是a,还是a[i],其实在编译器看来都是一个指向内存中的指针。编译器可已经知道a是一个二维数组的指针,所以他会把a[i]和*(a+i)当指针地址来看,而不会当成一个数来看,如果数组在定义的时候是一维数组,比如定义成a[i],那这个时候*(a+i)可能就是a[i]的值了。
2.你在printf中写的是%s,就是让把地址中的值以字符串输出的。你是这样要求的,当然编译器就这么作了,你要是用%i输出的话,你看到的可能就是string的指针地址值了。
2.你在printf中写的是%s,就是让把地址中的值以字符串输出的。你是这样要求的,当然编译器就这么作了,你要是用%i输出的话,你看到的可能就是string的指针地址值了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.指针存储的也是一种值,但这个值被解释成地址,指针本身在内存中也有自己的地址,因此会有指向指针的指针……
2.你传给printf字符串的首地址,函数就能顺藤摸瓜地找到整个字符串的值(因为字符串在内存中是连续的,并且有一个确定的值'\0'作为结尾),%s的意思就是让函数这样找……
2.你传给printf字符串的首地址,函数就能顺藤摸瓜地找到整个字符串的值(因为字符串在内存中是连续的,并且有一个确定的值'\0'作为结尾),%s的意思就是让函数这样找……
追问
能就第二种具体说明一下吗例如*(a+0)+3表示数组元素a[0] [3] ,那么(a+0)表示的是第0行的首地址*(a+0)表示第0行第一列的值,那他再加个3就是第一个元素的值再加3,而不是使指针向后移动不是吗?(a+0)表示什么?*(a+0)表示什么?
追答
(a+0)表示的是第0行的首地址,*(a+0)表示第0行的值(即a[0])……因此*(a+0)得到的也是一个指针……
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*是指针运算符,运算对象是地址编号,数组名和指针变量都是地址编号。
“printf("%s\n'',string);”改为“printf("%d\n'',string);”就可以看到地址编号了!
字符串的操作和数组的操作与普通的变量是有点不一样的。
“printf("%s\n'',string);”改为“printf("%d\n'',string);”就可以看到地址编号了!
字符串的操作和数组的操作与普通的变量是有点不一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1: 你既然理解了1,3,4就好办了,*(a+i)==a[i],2就这么理解
2:你可以理解为c语言的规定,%s输出的是string指针所指向的内容,你想输出地址值可以用%u或%d
2:你可以理解为c语言的规定,%s输出的是string指针所指向的内容,你想输出地址值可以用%u或%d
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询