两个c语言问题,二维数组,指针,字符串。急!!!

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要是一个字符指针的话,那么它存放的不是字符串的首地址吗?输出的也应该是字符串的首地址,怎么能输出字符串呢?

1、*(a+i)里面的确是一个值,但是在二维数组中,a[i][j]中的a[i]表示的是第i行的地址,所以这个值其实是一个地址,那么*(a+i)+j 就可以表示第i行第j列的地址。
其实,你还可以这样看,a是地址,a+i是地址,*(a+i)是该地址里面存储的地址,指向第i行。
2、因为你用的%s输出的,string的确是一个字符串的首地址,他会根据首地址一直往下读,直到读到'\0'为止!
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-11
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个回答  2013-02-11
1.指针存储的也是一种值,但这个值被解释成地址,指针本身在内存中也有自己的地址,因此会有指向指针的指针……
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)得到的也是一个指针……

本回答被网友采纳
第3个回答  2013-02-14
*是指针运算符,运算对象是地址编号,数组名和指针变量都是地址编号。
“printf("%s\n'',string);”改为“printf("%d\n'',string);”就可以看到地址编号了!
字符串的操作和数组的操作与普通的变量是有点不一样的。
第4个回答  2013-02-11
1: 你既然理解了1,3,4就好办了,*(a+i)==a[i],2就这么理解

2:你可以理解为c语言的规定,%s输出的是string指针所指向的内容,你想输出地址值可以用%u或%d
相似回答