今天看了一些有关数组的简单知识,自己便概括总结如下:
一维数组的创建,初始化,使用以及在内存中的存储
创建 ,初始化
1.数组创建时,[ ]中必须是常量,不可以使用变量。
int count = 10;
int arr[count];
//此处虽然count的值为10,但是它仍然是一个变量,不能放在[]中。
2.数组在创建时,如果想要不指定数组的大小,那就必须得初始化数组。数组的元素个数根据初始化的内容来确定。
例如:
int arr1[10] = {0};
int arr2[] = {1, 2, 3, 4, 5};
//此处数组arr2的大小就为5。
使用
1.数组是使用下标来访问的,下标从0开始。
2.数组的大小可以通过计算得到。
#include <stdio.h>
int main()
{
int arr[10] = {0};
//对数组内容赋值。
int i = 0; //作下标
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
arr[i] = i;
}
//输出数组的内容。
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//在对数组进行赋值和输出数组过程中,for循环的判断条件处不直接用10而采用计算的好处是:
//当数组的大小发生变化是,此处代码不用再做修改。
内存中的存储
为了了解数组在内存中存储,我们可以先打印观察数组每个元素的地址:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]), i++)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
输出结果如下:
仔细观察便可以知道,数组在内存中是连续存放的,并且是从底地址处向高地址处依次存放。
一维数组的指针访问
1.数组的数组名就是数组首元素的地址:
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%d\n", *arr);
return 0;
}
输出结果如下:
2.通过对数组名+整数的运算,我们可以获得每个元素的地址:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
printf("&arr[%d]=%p, &arr[%d]=%p\n", i, &arr[i], i, arr+i);
}
return 0;
}
输出结果如下:
因此,我们便可以通过指针来访问数组:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
int *p = arr;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
*(p+i) = i;
}
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d ", *(p+i));
}
return 0;
}
输出结果为:
二维数组
创建,初始化
二维数组在初始化过程中,可以不给出行的大小,但必须给定列的大小。
使用
二维数组的使用也是通过下标:
#include <stdio.h>
int main()
{
int arr[3][4] = {0};
int i = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
int j = 0;
for(j=0; j<sizeof(arr[0])/sizeof(arr[0][0]); j++)
{
arr[i][j] = i+j;
}
}
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
int j = 0;
for(j=0; j<sizeof(arr[0])/sizeof(arr[0][0]); j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
内存中的存储
二维数组在内存中也是连续存储的。
数组作为函数参数
数组作为函数参数时,实际上只是把数组的首元素的地址传递过去,并不会把整个数组传递过去。因此在函数内部,无法用sizeof
求得数组大小。
数组名代表整个数组的两种情况
1.sizeof(数组名),即数组名单独放在sizeof内部。
2.&数组名,此处数组名代表整个数组,取出的是整个数组的地址。
或许还有很大的不足,希望大家可以指出,互相探讨。