C语言指针问题

main( )
{ int a[2][3]={{3,2,7},{4,8,6}};
int *p,m;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
printf(“m=%d”,m);}

m=(*p)*(*(p+2))*(*(p+4));
这一句解释

解释上面的都说得清楚了。
这个得给你补补基础:
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.
二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。
如果有:int a[M][N];
则将二维数组中的元素a[i][j]转换为一维线性地址的一般公式是:
线性地址=a+i×M+j
其中:a为数组的首地址, M和N分别为二维数组行和列的元素个数。
若有:int a[2][3], *p;
p = &a[0][0];

一样的 <BR>int a[3][4];

int * p = a;

然后p+((i)*4+j)
就是指向的是a[i][j] 这个元素
相当于p+X,这个X就是从a[0][0]元素开始加到指定X的位置的元素,先行,再列。
所以:*p = a[0][0];
*(p+2) = a[0][2];
*(p+4) =a[1][1];

所以结果就是m=a[0][0]*a[0][2]*a[1][1]

m=3*7*8
m = 168
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-19
分成这三块
(*p) 取内容 .................a[0][0]
(*(p+2)) p是数组首元素地址,+2的意义是:移动2个p所指类型元素的长度,及移动到a[0][2]=3
(*(p+4)) 同上, 但已经移动到数组的第二行了,是a[1][1]=8 , 最后三块相乘
二维数组在内存中是按行顺序存储的。。。
第2个回答  2011-01-19
m=a[0][0]*a[0][2]*a[1][1]

m=3*7*8
你看一下教程中数组的指针表达就懂了
第3个回答  2011-01-19
看着累,我绝不这么写代码
第4个回答  2011-01-19
p是指向二维数组中单个元素的指针,所以*p和*(p+2)和*(p+4)分别是取二维数组第一个、第三个和第五个元素的值,即:3,7,8。然后几个数一相乘就得到最后的结果了。
第5个回答  2011-01-19
p指向的值乘以p+2指向的值再乘以p+4指向的值

c语言指针的赋值问题
在C语言中,指针的赋值是通过将变量的地址赋给指针变量来实现的。指针的基本概念 在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这...

C语言指针问题
假如 P 是指针 那么 *p 就代表变量。 而&a是地址, *p=&a 就是把地址给变量,当然不正确了,因为地址只能给指针。p2,*p1都是变量,变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义...

c语言程序指针问题
分析:程序没有正确区分数组和指针。在C语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

c语言选择题(指针)
答案是A,首先定义p是一个指向int类型的指针,不过这个指针没有初始化,也就是没有指向。然后定义了一个int类型的变量i,这里千万不要认为i也是个指针,如果i跟p一样,要在前面也加个*号。然后分析答案: A,这里对p指向的变量进行赋值,这里是相当于初始化了。所以正确。B,不正确\/不合理,因为p的...

C语言中的指针问题到底是怎么回事~
在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把...

c语言这几道题 关于指针的 望大神解答
2、A之所以错是因为代码中有一句q=NULL,也就是说q是一个空指针了,你再向里面写东西就错了,而且你在vc6.0中可以试一下,马上会出现一条0xc000 0005的写异常。。3、是的,你不管给它赋值多少都是4的。。就好比一个4平方米的房子,你装多少东西,装什么东西,它都是4平方米。有问题继续追问...

C语言求助指针的移动问题
这几个运算符中,=叫赋值运算符,它的优先级最低,而++的优先级最高,*次之。其实运算结果也不是“先赋值”,是先进行*操作从p指向的地址中取出值来才赋给S的,最后才对p增1。之所以优先级最高的++在最后进行,是由它自身的功能决定的:它写在变量后面,叫后增1运算符。后增1运算符要在它...

C语言指针的赋值问题
int*p;p为指针,地址是未知的,如果直接赋值 p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。可以int*p=&a;或者int*p;p=&a;然后再对p进行操作 有错。注意大小写,...

c语言,指针指向另一个指针的问题,为什么报错?
图中红色框内代码有误,*(p+5)不是表示指针而是值。应改为 q = p+5 另外补充说明,改成这样虽然没有语法错误,但是很明显p+5已经超过数组a的内存空间,需要注意。

相似回答
大家正在搜