目录
1、数组的格式
2、下列有什么区别
3、维数组的使用
4、*p 和 int* p = arr 的含义
5、二维数组:打印一个二维数组
6、二维数组在数组中的存储
7、数组作为函数参数
8、数组名是数组首元素的地址
1、数组的格式
数组是一组相同类型元素的集合。
数组的创建方式:
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
2、下列有什么区别
说明打印数组的时候是以'\0'结尾的
3、维数组的使用
对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作行。我们来看代码:
int main()
{
int i = 0; //做下标
int arr[10] = {0};//数组的不完全初始化
//计算数组的元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
arr[4] = 5; //第5个元素赋值为5,这里的[4]是下标引用操作符
//对数组内容赋值,数组是使用下标来访问的,下标从0开始:
for(i=0; i<sz; i++) //这里写10好不好
{
printf("%d ",arr[i]);
}
//输出数组的内容
}
再看下代码输出什么?
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<10; i++)
{
printf("&arr[%d] = %p\n",i,&arr[i]);
}
return 0;
}
输出:
&arr[0] = 006FF7A8
&arr[1] = 006FF7AC
&arr[2] = 006FF7B0
&arr[3] = 006FF7B4
&arr[4] = 006FF7B8
&arr[5] = 006FF7BC
&arr[6] = 006FF7C0
&arr[7] = 006FF7C4
&arr[8] = 006FF7C8
&arr[9] = 006FF7CC
请按任意键继续. . .
4、*p 和 int* p = arr 的含义
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int* p = arr; //数组的地址就是数组首元素的地址,现在把数组地址放到指针p中
//arr这个数组的地址放到p中,*说明是个指针变量,int:被指向的类型是整形
int i = 0;
for(i=0; i<=10; i++)
{
printf("%d ",*p); //*p就是解引用(p是地址,解引用就是把p地址上的东西拿出来)
p++; //p++就是下一个地址p
}
return 0 ;
}
5、二维数组:打印一个二维数组
int main()
{
int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i = 0;
int j = 0;
for(i=0; i<=2; i++ )
{
for(j=0; j<=3; j++)
{
printf("%2d ",arr1[i][j]);
}
printf("\n");
}
return 0;
}
6、二维数组在数组中的存储
int main()
{
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i = 0;
int j = 0;
for(i=0; i<=2; i++ )
{
for(j=0; j<=3; j++)
{
printf("&arr[%d][%d]=%p ",i,j,&arr[i][j]);
}
printf("\n");
}
return 0;
}
输出:说明二维数组在内存中也是连续存放的!行内部连续,跨行也是连续的!
&arr[0][0]=00B5F6EC &arr[0][1]=00B5F6F0 &arr[0][2]=00B5F6F4 &arr[0][3]=00B5F6F8
&arr[1][0]=00B5F6FC &arr[1][1]=00B5F700 &arr[1][2]=00B5F704 &arr[1][3]=00B5F708
&arr[2][0]=00B5F70C &arr[2][1]=00B5F710 &arr[2][2]=00B5F714 &arr[2][3]=00B5F718
请按任意键继续. . .
还可以用下面的方法知道!行内部连续,跨行也是连续的!
int main()
{
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i = 0;
int*p = &arr[0][0];
for(i=0; i<=12; i++ )
{
printf("%d ",*p);
p++;
}
printf("\n");
return 0;
}
7、数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数,
比如:我要实现一个冒泡排序( 这里要讲算法思想)函数将一个整形数组排序。那我们将会这样使用该函数:
void popo(int arr[],int sz)
{
int i = 0;
for(i=0; i<sz-1; i++)
{
int j = 0;
for(j=0; j<sz-1-i; j++)
if(arr[j] < arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
popo(arr,sz);
return 0;
}
8、数组名是数组首元素的地址
但是有两个例外
#1.sizeof(数组名) 数组名表示整个数组
#2.&数组名,表示取这个数组的地址
//数组名是数组首元素的地址
//但是有两个例外
//1.sizeof(数组名) 数组名表示整个数组
//2.&数组名,表示取这个数组的地址
int main()
{
int arr[10] = { 0 };
printf("%p\n",arr);
printf("%p\n",arr+1);
printf("%p\n",&arr);
printf("%p\n",&arr+1);
//printf("%p\n",arr);
//printf("%p\n",&arr[0]);
return 0;
}
学习浏览