27 数组的本质分析

一、数组的概念



 数组的大小:



编程实验:数组的初始化

#include <stdio.h>

int main()
{
    int a[5] = {1, 2};
	//int a[5] = {0}; //编译器会将未指定的元素初始化为0 
	 
    int b[] = {1, 2};
    
    printf("a[2] = %d\n", a[2]); //0  //编译器将没有指定的数组元素初始化为0
    printf("a[3] = %d\n", a[3]); //0
    printf("a[4] = %d\n", a[4]); //0
    
    printf("sizeof(a) = %d\n", sizeof(a)); //20
    printf("sizeof(b) = %d\n", sizeof(b));  //8
	//元素个数=数组大小÷每个元素的大小
    printf("count for a: %d\n", sizeof(a)/sizeof(int));  //5
    printf("count for b: %d\n", sizeof(b)/sizeof(int));  //2
    
    return 0;
}

 输出:

 二、数组地址与数组名

编程实验:数组名与数组地址

#include <stdio.h>

int main()
{
    int a[5] = { 0 };

    printf("a = %p\n", a); //a代表数组第一个元素的地址,长度为4
    printf("&a = %p\n", &a);//对整个数组取地址,与上一个语句的地址相同,但长度为20
    printf("&a[0] = %p\n", &a[0]);
    
    return 0;
}

 输出:

结果分析:输出的三个地址相同,第一和第二条代码输出的地址也相同,但是它们的内存空间从长度却是不一样的。可以通俗地描述为:我们使用GPS定位我们家和小区的位置,得到两个的位置是一样的,但是小区和家却有着本质的区别。

三、数组名的盲点

编程实验1:

#include <stdio.h>

int main()
{
	int a[5] = { 0 }; //定义数组a,每个元素初始化为0
	int b[2]; //初始化的值为随机的
	int* p = NULL;

	p = a; //将指针p指向数组a

	printf("a = %p\n", a); //p = 0020F9BC; 打印数组的第一个元素的地址
	printf("p = %p\n", p);  //p = 0020F9BC; 打印数组的第一个元素的地址
	printf("&p = %p\n", &p); //&p = 0020F9A0; 指针是变量,所以有地址
	printf("sizeof(a) = %d\n", sizeof(a));//sizeof(a) = 20
	printf("sizeof(p) = %d\n", sizeof(p));//sizeof(p) = 4

	printf("\n");
	getchar();
	return 0;
}

 输出:

 结果分析:

  说明指针p 和 数组a 是两个不同的东西。

编程实验2:

#include <stdio.h>

int main()
{
	int a[5] = { 0 }; //定义数组a,每个元素初始化为0
	int b[2]; //初始化的值为随机的
	int* p = NULL;


	printf("\n");

	p = b; //将指针p指向数组b

	printf("b = %p\n", b);//数组b的地址
	printf("p = %p\n", p); //p指针指向的地址
	printf("&p = %p\n", &p);//p指针自身的地址
	printf("sizeof(b) = %d\n", sizeof(b)); //8
	printf("sizeof(p) = %d\n", sizeof(p));  //4

	//b = a; //将一个数组名赋给另一个数组(不兼容的类型) 

	return 0;
}

输出:

四、小结

 

本文为听课笔记,课程出处:
    https://item.taobao.com/ 

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/83447618
27
今日推荐