文章目录
1 数组的基本概念
1.1 数组的概念
数组是相同类型的变量的有序集合。
1.2 数组的大小
数组的大小:
- 数组在一片连续的内存空间中存储元素。
- 数组元素的个数可以显示或隐式指定。
a[2] = 0, a[3] = 0, a[4] = 0;b中包含了2个元素。
2 数组名
2.1 数组地址与数组名
关于数组地址和数组名:
- 数组名代表数组首元素的地址。
- 数组的地址需要用取地址符号&才能得到。
- 数组首元素的地址值与数组的地址值相同。
- 数组首元素的地址与数组的地址是两个不同的概念。
2.2 数组名的盲点
数组名必须知道如下几点:
- 数组名可以看作一个指针常量。
- 数组名“指向”的是内存中数组首元素的起始位置。
- 数组名不包含数组的长度信息。
- 在表达式中数组名只能作为右值使用。
- 只有下列场合中数组名不能看作常量指针。
- 数组名作为sizeof操作符的参数。
- 数组名作为&运算符的参数。
数组名在大多数情况下被当成常量指针处理,但是数组名并不是指针,不能将其等同于指针!
3 a和&a的区别
3.1 a和&a的区别
a和&a的区别如下:
- a为数组首元素的地址。
- &a为整个数组的地址。
- 两者类型不同。
- a和&a的区别在于指针运算。
示例代码:
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);
printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);
return 0;
}
// p1[-1]输出5,p2[0]输出33554432, p3[1]输出3(小端系统)
4 二维数组
4.1 二维数组的概念
二维数组的基本概念:
- 二维数组在内存中以一维的方式排布。
- 二维数组的第一维是一维数组。
- 二维数组中的第二维才是具体的值。
- 二维数组的数组名可看作常量指针。
注意:内存中并不存在a[0]、a[1]、a[2]这一维。
二维数组的遍历:
#include <stdio.h>
#include <malloc.h>
void printArray(int a[], int size)
{
int i = 0;
printf("printArray: %d\n", sizeof(a));
for(i=0; i<size; i++)
{
printf("%d\n", a[i]);
}
}
int main()
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int* p = &a[0][0];
int i = 0;
int j = 0;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("%d, ", *(*(a+i) + j));
}
printf("\n");
}
printf("\n");
printArray(p, 9);
return 0;
}
4.2 二维数组的数组名
一维数组名代表数组首元素的地址:
int a[5]
,a的类型为int*
。
二维数组名同样代表数组首元素的地址:int m[2][5]
,m的类型为int(*)[5]。
结论:
- 二维数组名可以看作是指向数组的常量指针。
- 二维数组可以看作是一维数组。
- 二维数组中每个元素都是同类型的一维数组。
动态申请二维数组:
#include <stdio.h>
#include <malloc.h>
int** malloc2d(int row, int col)
{
int** ret = NULL;
if( (row > 0) && (col > 0) )
{
int* p = NULL;
ret = (int**)malloc(row * sizeof(int*));
p = (int*)malloc(row * col * sizeof(int));
if( (ret != NULL) && (p != NULL) )
{
int i = 0;
for(i=0; i<row; i++)
{
ret[i] = p + i * col;
}
}
else
{
free(ret);
free(p);
ret = NULL;
}
}
return ret;
}
void free2d(int** p)
{
if( *p != NULL )
{
free(*p);
}
free(p);
}
int main()
{
int** a = malloc2d(3, 3);
int i = 0;
int j = 0;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("%d, ", a[i][j]);
}
printf("\n");
}
free2d(a);
return 0;
}
参考资料: