c语言二维数组行列指针转换问题,图中画的句子真是理解不了,从行转换成列我懂,从列转换成行就不懂了,

c语言二维数组行列指针转换问题,图中画的句子真是理解不了,从行转换成列我懂,从列转换成行就不懂了,就是划线句子

第1个回答  2015-03-07
#include <stdio.h>
int main()
{
    char a[2][4] = { "123", "456" }; //等价于a数组里面有两个元素:a[0] = "123"; a[1] = "456";
    char (*p)[4];  
    p = a; 
    printf( "%s\n", p ); //p指向数组a的第一个元素,即a[0],输出123 
    printf( "%c\n", *(a[0]+1) ); //a[0]指向字符串"123", a[0]就是第一个字符'1'的地址,a[0]+1就是第二个字符'2'的地址,那么*(a[0]+1)就是字符'2'  
    p++; //p之前指向数组a的第一个元素a[0], p++后,p就指向数组a的第二个元素a[1]了.
    printf( "%s\n", p ); //p指向a[1],即输出"456" 
    getchar();
    return 0;
}
//不懂再问.

追问

我想问为什么指向列的指针加上&后就指向行了,上面你解释的我都明白

本回答被网友采纳
第2个回答  2015-03-07
它就是说指向第一个0行0列的元素的指针加上一个&,就等价于指向二维数组第0行的的指针,本来是指向元素的,现在指向那行了,追答

a[0]+1=&a[0][1],

&a[0]+1=a+1=&a[1]

追问

第二个等式是为什么

追答

因为&a[0]指向的是第0行,那么&a[1]指向的就是第一行

追问

为什么&a[0]是指向第零行的,这就是我最不明白的地方

追答

可以将a[0]看成是第0行的数组名,因此a[0]指向第0行的首元素,而a+0指向第0行,*a就指向0行的首元素,于是有a[0]=*a,同时加一个&符号,就有&a[0]=a,因为a指向第0行,于是有&a[0]指向第0行

追问

那 为什么&*a=a呢,这里不懂

麻烦大神解释一下

追答

汗,如果a是一个地址,则*a就是a存放的值,而&*a又是这个值的地址,所以&和*是可以抵消的,类似正负号可以抵消一样

追问

可是二维数组中不是不能这样想吗,毕竟a中并没有存放任何东西

我先采纳了,毕竟大神回答了这么多,希望能给我讲明白

追答

反正你只要知道*和&是可以抵消就行了

本回答被提问者采纳
相似回答