C语言指针问题

作者&投稿:彭李 (若有异议请与网页底部的电邮联系)
解释上面的都说得清楚了。
这个得给你补补基础:
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.
二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。
如果有: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

分成这三块
(*p) 取内容 .................a[0][0]
(*(p+2)) p是数组首元素地址,+2的意义是:移动2个p所指类型元素的长度,及移动到a[0][2]=3
(*(p+4)) 同上, 但已经移动到数组的第二行了,是a[1][1]=8 , 最后三块相乘
二维数组在内存中是按行顺序存储的。。。

m=a[0][0]*a[0][2]*a[1][1]

m=3*7*8
你看一下教程中数组的指针表达就懂了

看着累,我绝不这么写代码

p是指向二维数组中单个元素的指针,所以*p和*(p+2)和*(p+4)分别是取二维数组第一个、第三个和第五个元素的值,即:3,7,8。然后几个数一相乘就得到最后的结果了。

p指向的值乘以p+2指向的值再乘以p+4指向的值

C语言指针问题~

是的,就是那里出错了。要为你scanf输入字符串开辟空间,否则,怎么能输入呢

#include
#include
void main()
{
char *p[3],*temp;
int i,j,k;
printf("Please input the string:");
for(i=0;i<3;i++)
{
p[i] = new char[20];
scanf("%s",p[i]); // 我不知道是不是这里出错了,指针数组应该如何输入数据?//
}
for(i=0;i<2;i++); // 用选择排序法把字符串按从小到大的顺序排序//
{ k=i;
for(j=i+1;j<3;j++)
if(strcmp(p[k],p[j])>0)
k=j;
if(k!=i)
{
temp=p[i];p[i]=p[k];p[k]=temp;
}

}
for(i=0;i<3;i++)
printf("%s
",p[i]);
getchar();
getchar();
for(i = 0; i < 3; ++i) delete p[i];
}

int a[2][3], *p[3];
分析:
对于a来说,毫无疑问,a是一个二维数组,a的值指向int类型的起始地址。
对于p,首先p先与'[ ]'结合 p[3],表示p是一个数组,p再与'*'结合成' *p[3] ',表示p数组里面存放的时指针变量,最后与int类型结合成' int *p[3] ',表示数组存放的时指向int类型的指针。
p[0]=&a[1][2];
所以p[0]的值是一个指向int类型的指针。
而a[1][2]的值是一个int类型,再加上'&'(取地址符)得到的就也是一个指向int类型的指针了。
所以p[0]=&a[1][2];成立。
建议ZL看看 《让你不再害怕指针》
回答完毕.

C语言中的指针问题到底是怎么回事~
答:以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存...

C语言指针问题
答:1、ptr赋值为arr地址后指向第一个元素,即元素6.2、*(ptr++) += 123;由于是右侧操作(递增后缀),所以先取ptr地址后再递增ptr,此时取得的地址还是第一个元素地址(递增后ptr指向第二个元素,也就是7,这是第一次递增),因此是对6+123=129,并保存原地址,即第一个元素地址,因此6被改为129...

c语言 指针问题
答:1:char s[5]={'A','B','C','D','E'};这是个字符数组的初始化,没有问题,但它不是以字符串结束符'\0'结尾的,所以它不是字符串。如果你是想将字符串"ABCDE"赋值给字符数组s,就应该使用char s[6]="ABCDE",字符数组s的大小要定义为6,因为需要一个字符用来存储'\0',它是一个标...

C语言指针问题(初学者)
答:1.概念问题:指针是指存放地址值的变量或常量;指针与一般变量或常量的区别,在于它不直接存储数值,而是存放被存储数值的地址,属于间接存放,所以不少初学者感觉学习困难。比如:int a=2,b,c,*ptr; ptr=&a;表示将指针ptr指向变量a,存放a的地址,假设是2000H,而指针变量ptr本身也要有地址,假...

关于c语言指针的一些问题
答:指针p 指向的单元 内容为 a [0] 3、a 是数组名的时候是正确的 他表示 a[0] = 指针p所指单元的内容。其实 理解指针的话 有一个很好的 方法 你可以把 指针变量p当做一个数组名 那么*p 也就表示 p[0] p也就表示指针 p 然后你就会知道该如何赋值了 。希望对你有所帮助 ...

C语言 链表 指针问题
答:stts=creatSTT(); stt0[i]=stts[0];//这就是你想要得到的正向链表首指针数组 stt1[i]=stts[1];//这就是你想要得到的反向链表首指针数组 } printf("输入的所有链表为\n"); for(i=0;i<size;i++) { sttHead->next0=stt0[i];...

c语言程序指针问题
答:1、指针赋值带来的内存丢失在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: main(){float *a, *b;a=(float)malloc( sizeof( float));b=(float)malloc( ...

C语言指针问题
答:p2,*p1都是变量,变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义就变了,而地址只能赋值给指针不能给变量。最后建议学习看书一定要读国外原著,国内翻译或作者的理解或描述,未必就是正确和合适...

c语言关于指针问题 int x=2,y=5,*px=&x,*py=&y;这个语句*px=&x正确么...
答:int x=2, *px; // 声明 变量 x, 初始化 x=2, 声明 px 是 指针 变量 px=&x; // 这里 是语句,这个语句 不正确。语句里要写:px = &x; // 把 x 的地址 赋给 px, 也就是 让 px 指向 x.接下来要是有语句:px = 5; // 这个语句正确, 语句里 *px 是 值 y ...

C语言的数组和指针问题,谢谢高手的解答!
答:总结,问题的关键在于,数组名相当于一个指向于这个数组第一个元素的指针。3)所以,int A[2][3][4]={0};A是一个三维数组,其中A[0]和A[1]都是它的元素,A[0]是第一个元素。所以, A是一个三级指针,指向了这个数组的第一个元素A[0],而A[0]是一3*4的二维数组。而A[0]是一个...