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]
- 数组名是数组首元素的起始地址,但并不是数组的起始地址
- 通过将取地址符&作用于数组名可以得到整个数组的起始地址
定义数组指针 有两种
- 通过数组类型定义数组指针:
typedef int(ArrayType)[5]; int *a
ArrayType* pointer;
-
声明一个数组指针类型 typedef int (*MyPointer)[5];
MyPointer myPoint; -
直接定义: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