C语⾔学习之:⼀维数组、⼆维数组的取值和取地址问题
⽂章⽬录
1. ⼀位数组的取值操作与取地址操作
假设现在有⼀个⼀位数组 a = [1,2,3,4,5]
因为 a 是⼀个数组,⽽在 C 语⾔中规定,数组变量的名称代表的就是⼀个数组的地址值,因此,打印 a 即打印 a 的地址值因为 a 本⾝就是个地址,因此对它取地址其实得到的还是数组 a 的地址,因此结果也相同
⼀个数组的地址值本⾝也是它第⼀个元素的地址值,因此第三个输出也是同样的结果
因为指针就可以看做是地址,因此我们也可以说数组 a 的指针就是 00AFFBEC
#include<stdio.h>
void main(){
int a[]={1,2,3,4,5};
printf("%p\n", a);
printf("%p\n",&a);
printf("%p\n",&a[0]);
}
2. ⼆维数组的取值操作与取地址操作
⼆维数组相对于⼀维数组来说复杂⼀些
⼆维数组的变量名称代表的也是整个数组的地址值,也是⾸地址值,因此以下代码中前五种情况得到的都是⼆维数组的地址值。
特别注意 *a,
在⼀维数组中由于 a 是第⼀个元素 a[0] 的地址值,因此对于 a 进⾏取值操作* 之后,可以直接得到 a[0] 的值;
⽽在⼆维数组中,直接对于⼆维数组 a 进⾏取值操作得到的竟然不是⼀个确切的数,依然还是⼀个地址值,这点需要特别注意。
但是 如果我们⽤⼀个指针 p 来指向⼀个⼆维数组的⾸地址 a,那么对于 p 直接进⾏取值操作得到的就是⼀个值。也就是说,这⾥的⼆维数组中 *p != *a;但是⼀维数组中的 *p == *a
#include<stdio.h>
void main(){
指针与二维数组
int a[2][3]={{1,2,3},{4,5,6}};
int* p=a;
printf("%p\n", a);
printf("%p\n",&a);
printf("%p\n",*a);
printf("%p\n",&a[0]);
printf("%p\n",&a[0][0]);
printf("%d\n",*p);
}
3. ⼀维数组与⼆维数组的共同点和差别
4. 深⼊讨论*a的问题
⾄于为什么对于⼆维数组 *a 只能得到地址的问题,可以这么理解:例如⼀个 2 ⾏ 3 列的⼆维数组可以理解为他依然是⼀个⼀维数组,只不过第 1 个元素的位置存放的是 3 个地址值,第⼆个元素的位置存放的也是 3 个地址值;这三个地址值指向的三个值才是真正的值。因此a[0] 对应着 a[0][0],a[0][1],a[0][2] 的地址值,因此对 a 取值得到的还是地址值

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。