(五)C 语言之数组

1.1 基本概念
1.1.1 概念
1)元素类型角度:数组是相同类型的变量的有序集合 测试指针变量占有内存空间大小
2)内存角度:联系的一大片内存空间
1.1.2 数组初始化

  • //数组元素的个数可以显示或隐式指定
  • //分析数组初始化{0}与memset比较
int main()
{
	int i = 0;
	int a[10] = {1,2}; //其他初始化为0
	int b[] = {1, 2};
	int c[20] = {0};
 
	for (i=0; i<10; i++)
	{
		printf("%d ", a[i]);
	}
	memset(a, 0, sizeof(a));

	return 0;	
}

1.1.3 数组名的技术盲点
1)数组首元素的地址和数组地址是两个不同的概念
2)数组名代表数组首元素的地址,它是个常量。
解释如下:变量本质是内存空间的别名,一定义数组,就分配内存,内存就固定了。所以数组名起名以后就不能被修改了。
3)数组首元素的地址和数组的地址值相等
4、怎么样得到整个一维数组的地址? &buf
C语言规定:
Int a[10];
printf(“得到整个数组的地址a: %d \n”, &a);
printf(“数组的首元素的地址a: %d \n”, a);
怎么样表达int a[10]这种数据类型那?

1.2 数组类型、数组指针类型、数组指针类型变量

1.2.1 数组类型

  • 类型本质是固定内存大小的别名
 //typedef  int (MYINT)[5];
int main()
{	
	typedef int (MyArray)[5];
	int  i =0;
	MyArray arr;
	for(i =0 ;i< 5;i++)
	{
		arr[i] = i +10;
	}
	for(i =0;i<5; i++)
	{
		printf("%d\n",arr[i]);
	}
	printf("arr: %d, arr+1 :%d\n",arr,arr+1);       //arr代表数组首元素地址
	printf("&arr: %d, &arr+1 :%d\n",&arr,&arr+1);  // &arr代表整个数组的地址
	return 0;
}

1.2.2 数组指针类型
1.2.2.1数组指针类型
数组指针用于指向一个数组

  • int a[10]
  • 数组名是数组首元素的起始地址,但并不是数组的起始地址
  • 通过将取地址符&作用于数组名可以得到整个数组的起始地址

定义数组指针 有两种

  1. 通过数组类型定义数组指针:
typedef int(ArrayType)[5];  int *a
ArrayType* pointer;
  1. 声明一个数组指针类型 typedef int (*MyPointer)[5];
    MyPointer myPoint;

  2. 直接定义:int (*pointer)[n];
    pointer 为数组指针变量名
    type 为指向的数组的类型
    n 为指向的数组的大小

1.2.2.2 数组指针类型案例

  • 通过数组类型定义数组指针:
int main()
{
	typedef int (arraytype)[5];
	int array[5];
	int i =0;
	arraytype * p= &array;
	for( i =0 ;i<5;i++)
	{
		(*p)[i] = i+5;
	}
	for(i=0;i<5;i++)
	{
		printf("%d\n",(*p)[i]);
	}

}
  • 声明一个数组指针类型 typedef int (*MyPointer)[5];
int main()
{
	typedef int (*arraytype)[5];
	int array[5];
	int i =0;
	arraytype p =&array;
	for( i =0 ;i<5;i++)
	{
		(*p)[i] = i+5;
	}
	for(i=0;i<5;i++)
	{
		printf("%d\n",(*p)[i]);
	}
	return 0;
}
  • 直接定义:int (*pointer)[n];
int main()
{
	 int (*arraytype)[5];
	int array[5];
	int i =0;
	arraytype  =&array;
	for( i =0 ;i<5;i++)
	{
		(*arraytype)[i] = i+5;
	}
	for(i=0;i<5;i++)
	{
		printf("%d\n",(*arraytype)[i]);
	}
	return 0;
}

1.3多维数组本质

1.3.1 本质
多维数组的本质就是数组指针
//多维数组名的本质 数组指针 ,步长 一维的长度
// (a+i) 代表是整个第i行的地址 二级指针
// *(a+i) 代表 1级指针 第i行首元素的地址
// (a+i) + j ===> & a[i][j]
//
( (a+i) + j) =>a[i][j]元素的值
//a[i][j] <
= >
( *(a+i) + j)
//a[i] ===> a[0+i] ==> *(a+i);
//a[i][j] === a[0+i][j] ==> *(a+i)[j] ===> *(a+i)[0 + j] ==> *( *(a+i) + j)

1.4 指针数组的应用
1.4.1

//谁调用函数,谁分配内存
//操作系统分配内存,
int main(int argc, char* argv[], char**env)
{
	int i = 0;
	//main02_1();

	printf("******************* Begin argv *******************\n");
	for(i=0; i<argc; i++)
	{
		printf("%s\n", argv[i]);
	}

	// 	for(i=0; argv[i]!=NULL; i++)
	// 	{
	// 		printf("%s\n", argv[i]);
	// 	}
	printf("******************* End argv *******************\n");

	printf("\n");
	printf("\n");
	printf("\n");

	printf("******************* Begin env *******************\n");

	for(i=0; env[i]!=NULL; i++)  //
	{
		printf("%s\n", env[i]);
	}

	printf("******************* End env*******************\n");

	return 0;
}

1.4.2

1.4.3

参考一 : 狄泰软件课程
参考二 : 传智扫地僧老师课程
如有侵权:请联系邮箱 1986005934@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值