C语言学习之:一维数组、二维数组的取值和取地址问题

文章目录

  • 1. 一位数组的取值操作与取地址操作
  • 2. 二维数组的取值操作与取地址操作
  • 3. 一维数组与二维数组的共同点和差别
  • 4. 深入讨论 `*a` 的问题

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]);

}

C语言学习之:一维数组、二维数组的取值和取地址问题_第1张图片

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);

}

C语言学习之:一维数组、二维数组的取值和取地址问题_第2张图片

3. 一维数组与二维数组的共同点和差别

C语言学习之:一维数组、二维数组的取值和取地址问题_第3张图片

4. 深入讨论 *a 的问题

至于为什么对于二维数组 *a 只能得到地址的问题,可以这么理解:例如一个 2 行 3 列的二维数组可以理解为他依然是一个一维数组,只不过第 1 个元素的位置存放的是 3 个地址值,第二个元素的位置存放的也是 3 个地址值;这三个地址值指向的三个值才是真正的值。因此 a[0] 对应着 a[0][0],a[0][1],a[0][2] 的地址值,因此对 a 取值得到的还是地址值

C语言学习之:一维数组、二维数组的取值和取地址问题_第4张图片

你可能感兴趣的:(C语言学习笔记,c语言,算法)