指针引用数组
A. C语言用指针引用数组元素
(*p)[3]是定义一个指向一维数组的指针,数组元素为三。也就是说p指向的其实是a[0],a[1],a[2]这样的形式。
p=a;其实就是把第0行的首地址赋值给p.
所以答案C中p[1]即是把第1行的首地址给p,在此基础上向后移一位,取出地址中的元素数值。 *(p[1]+1)相当于a[1][1].所以是对的。
B的形式是对的,但是它相当于a[2][1],超出界限所以为错。剩下的两个格式就不对。
B. 用指针引用二维数组元素
a 是数组首地址,等于 &a[0][0].
*p 声明里是指针。语句里 *p 是 指针指向的值。 语句里 p 是地址.
*p 是1个星号的指针,可以让它指向1维数组,也可以让有序地它指向2维数的各元素。
int a[行][列]; a[j][i] 数组元素排列 是:
第一行 的 第1列,第二列,第三列....
第二行 的 第1列,第二列,第三列....
第三行 的 第1列,第二列,第三列....
2维数可以看成1维数组,排成1字长蛇阵:第一行 的 第1列,第二列,第三列..;
第二行 的 第1列,第二列,第三列....;。。。。直到最后一行最后一列。
#define row 3
#define col 4
int a[row][col]; // 某一元素: a[j][i]
int *p,i,j;
排成1字长蛇阵后,一维下标,可以用二维 下标计算: j*col + i.
某一元素: a[j][i] 的 数值 就是 * (p+j*col+i);
----
写出完整程序,依次输出所有元素,对比:
#include <stdio.h>
main()
{
#define row 3
#define col 4
int a[row][col] = { 0,1,2,3,4,5,6,7,8,9,10,11};
int *p;
int i,j;
p=&a[0][0];
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%2d ",a[j][i]);
printf("\n");
}
printf("===========\n");
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%2d ", *(p+j*col+i));
printf("\n");
}
return 0;
}
======
如果 是 int **p; 才有 *(*(p+i)+j))形式。
对应 a[j][i], 指向的值 是 *(*(p+j) + i)
C. 通过指针引用数组元素
[0]是首地址, &a[0][0]+3*1+2是首地址后面第五个元素,也就是a[1][2]
不能 p=a 这样赋值,p是int*[2]类型,a是int[2][3]类型 类型不同不能赋值
int a[2][3]是申请的一个连续地址,而*p[2]是一个指针数组,如果你能把每一行的首地址赋给这个指针数组的话,可以这么使用。但是如果只是给首地址赋值的话,此时这个指针数组的第二个元素,也就是第二行的首地址为一个随意地址,没有意义,不是连续的,所以不能实现*(p+3*1+2)来表示a[1][2]
D. 指针、数组名、引用三者的相同点与区别
上面一些说的太多,但重点没说;
1.指针:存放变量的地址的变量;
2. 数组名: 是一个常量类型的指针,这是与“指针”变量的最主要区别;
3.引用:用“地址”直接表示一个变量的手段,而指针是间接表示一个变量;
-----------------------------
!!!!!!!!!!!!!!!!
楼主连贴也不看了、也不结了,太忙了吧
E. 指针、引用、数组的对比
指针:储存变量地址的变量,可以被计算、赋值!
引用:基本相当于常量指针,不能计算,可以初始化一次!写法上和变量没区别!
数组(名):可以参加计算,但不能被赋值(这一点我也记不大清楚,好像是这样!)
F. c语言指针变量引用数组
"i love china!"
"i am a student!"
这两个都是常量字符串,存储在 静态存储区 ,不容修改。
G. 通过指针数组引用数组元素
*(&a[0][0]+3*1+2) &a[0][0]是首地址, &a[0][0]+3*1+2是首地址后面第五个元素,也就是a[1][2]
不能 p=a 这样赋值,p是int*[2]类型,a是int[2][3]类型 类型不同版不能赋权值
int a[2][3]是申请的一个连续地址,而*p[2]是一个指针数组,如果你能把每一行的首地址赋给这个指针数组的话,可以这么使用。但是如果只是给首地址赋值的话,此时这个指针数组的第二个元素,也就是第二行的首地址为一个随意地址,没有意义,不是连续的,所以不能实现*(p+3*1+2)来表示a[1][2]
H. c语言中,通过指针引用数组元素使用方法谁总结出来了
指针就是数组首地址,比如
int X=【5】;
int *p=X;
那么你要引用X[3](第4个)就是*(p+3)(这是存储的内容,一个存在X[3]内的值)
p+3,就是符号X[3]的地址
I. 初学C语言指针引用数组元素,很简单的原理没搞清,谢谢回答。
首先:
4个字节 = 32 bit = 32 位二进制位, 你说的很对。
还有, 在开始解释这个问题前, 我想先做几个规定, 方便解释:
我规定:
a 是数组的首地址, a = 0x00 , a 的地址是 0
那么, 我要开始解释你的问题了。
a + 1 中的 1 并不是 4 个字节的意思, 按道理 a + 1 应该等于 0x01 , 因为 a 的是数组的首地址, 它的值是 0. 但是编译器知道 a 是int类型的数组的首地址, 所以他会自作主张的做出如下的转换: (a+1) -> (a+1*4) , 其中的 4 就是 int 类型的大小, 如果 int 类型是 8 个字节的话, 这个转换就是 (a+1) -> (a + 1*8).
解释完了, 如果还有疑问, 欢迎追问
J. “用指针引用数组元素”是什么意思
就是说通过指针来访问数组,例如有一个指针int *p和一个数组int a[4][2]。如果p=&a则有*p=a[0][0],*(p+1)=a[0][1],*(p+2)=a[1][0]。。专。。指针就是一属个地址,操作起来会比数组效率高,但是这也在无形中给使用者增加了难度。