数组的学习总结
2016-07-19 19:57
197 查看
一、数组的定义以及初始化
1.整型数组:
在C89中,不支持使用变量定义数组的长度
①一维整型数组
数组名是一个指针常量,保存的是首元素的地址(不可做自加操作)
在定义的时候初始化:int a[3] = {1,2,3} 或 int a[ ] = {1,2,3}
键盘读入初始化(五种方法):
int *p = a;
for(i = 0; i < 3; i++)
{
scanf(“%d”,&a[i]);
/scanf(“%d”,a+i);
/scanf(“%d”,p++);
/scanf(“%d”,p+i);
/scanf(“%d”,&p[i]);
}
输出(五种方法):
for(i = 0; i < 3; i++)
{
printf(“a[%d] = %d”, i,a[i]);
printf(“a[%d] = %d”, i,*(a+i));
printf(“a[%d] = %d”, i,*(p++));
printf(“a[%d] = %d”, i,p[i]);
printf(“a[%d] = %d”, i,*(p+i));
}
内存结构图:
&a:数组的地址
a:数组首元素的地址
&a + 1:跳一个数组的长度
a + 1:跳一个元素的长度
由此可以得出结论:
&a:对一位数组数组名取地址等于数组的地址
*(&a):对一维数组的地址取值等于数组首元素的地址
&a保存在一个数组指针变量中 int (*pa)[MAX_SIZE] = &a
所以,*(&a) = *pa
②二维整型数组
定义的时候可以省略行数,但不能省略列数
二维数组数组名:首个一维数组的地址
初始化:scanf(“%d”, *(a + i) + j);
输出:printf(“%d”,*(*(a + i) + j));
内存结构:
由上图可以看出
a = 0x1000;
a[0][0] = *a;
*(&a) = a; //对二维数组的地址取值等于首个一维数组的地址
所以*(*(a+ i) + j)的解析为:
a + i:第i + 1个一维数组的地址
*(a + i):第i + 1个一维数组的首元素的地址
*(a + i) + j:第i + 1个一维数组的第j + 1个元素的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
③三维整型数组
*(*(*(a + i) + j) + k)的解析为:
a + i:第i + 1个二维数组的地址
*(a + i):第i + 1个二维数组的首个一维数组的地址
*(a + i) + j:第i + 1个二维数组的第j + 1个一维数组的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
2.字符型数组
①一维字符型数组
初始化:
scanf("%s", str);
输出:
printf("%d", str);
②二维字符型数组
int str[3][100]
初始化:
for(i = 0; i < 3; i++)
{
scanf("%s", *(str + i));
}
输出:
for(i = 0; i < 3; i++)
{
printf("%d\n", *(str + i));
}
二、数组名的作用
1.一维数组:数组名是指针常量,保存的是数组首元素的地址
2.二维数组:数组名是指针常量,保存的是首个一维数组的地址
3.三维数组:数组名是指针常量,保存的是首个二维数组的地址
三、数组指针
是一个指针变量,保存的是数组的地址
1.定义
char (*pa) [3][100];
2.初始化
*pa = src 或者 char (*pa) [3][100] = &src
3.作用
在函数传参的时候会使用到数组指针
一维数组名用指针来传
二维数组名用一维指针数组来接
三维数组名用三维指针数组来接
四、指针数组
指针数组里定义的指针都是野指针,需要用malloc()来分配空间
1.定义
int *pa[3];
2.初始化:
for(i = 0; i < 3; i++)
{
pa[i] = (int *)malloc(sizeof(int));
scanf("%d", pa[i]);
printf("%d", *pa[i]);
}
3.在定义函数时,数组指针要用指针的指针来接
1.整型数组:
在C89中,不支持使用变量定义数组的长度
①一维整型数组
数组名是一个指针常量,保存的是首元素的地址(不可做自加操作)
在定义的时候初始化:int a[3] = {1,2,3} 或 int a[ ] = {1,2,3}
键盘读入初始化(五种方法):
int *p = a;
for(i = 0; i < 3; i++)
{
scanf(“%d”,&a[i]);
/scanf(“%d”,a+i);
/scanf(“%d”,p++);
/scanf(“%d”,p+i);
/scanf(“%d”,&p[i]);
}
输出(五种方法):
for(i = 0; i < 3; i++)
{
printf(“a[%d] = %d”, i,a[i]);
printf(“a[%d] = %d”, i,*(a+i));
printf(“a[%d] = %d”, i,*(p++));
printf(“a[%d] = %d”, i,p[i]);
printf(“a[%d] = %d”, i,*(p+i));
}
内存结构图:
&a:数组的地址
a:数组首元素的地址
&a + 1:跳一个数组的长度
a + 1:跳一个元素的长度
由此可以得出结论:
&a:对一位数组数组名取地址等于数组的地址
*(&a):对一维数组的地址取值等于数组首元素的地址
&a保存在一个数组指针变量中 int (*pa)[MAX_SIZE] = &a
所以,*(&a) = *pa
②二维整型数组
定义的时候可以省略行数,但不能省略列数
二维数组数组名:首个一维数组的地址
初始化:scanf(“%d”, *(a + i) + j);
输出:printf(“%d”,*(*(a + i) + j));
内存结构:
由上图可以看出
a = 0x1000;
a[0][0] = *a;
*(&a) = a; //对二维数组的地址取值等于首个一维数组的地址
所以*(*(a+ i) + j)的解析为:
a + i:第i + 1个一维数组的地址
*(a + i):第i + 1个一维数组的首元素的地址
*(a + i) + j:第i + 1个一维数组的第j + 1个元素的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
③三维整型数组
*(*(*(a + i) + j) + k)的解析为:
a + i:第i + 1个二维数组的地址
*(a + i):第i + 1个二维数组的首个一维数组的地址
*(a + i) + j:第i + 1个二维数组的第j + 1个一维数组的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
2.字符型数组
①一维字符型数组
初始化:
scanf("%s", str);
输出:
printf("%d", str);
②二维字符型数组
int str[3][100]
初始化:
for(i = 0; i < 3; i++)
{
scanf("%s", *(str + i));
}
输出:
for(i = 0; i < 3; i++)
{
printf("%d\n", *(str + i));
}
二、数组名的作用
1.一维数组:数组名是指针常量,保存的是数组首元素的地址
2.二维数组:数组名是指针常量,保存的是首个一维数组的地址
3.三维数组:数组名是指针常量,保存的是首个二维数组的地址
三、数组指针
是一个指针变量,保存的是数组的地址
1.定义
char (*pa) [3][100];
2.初始化
*pa = src 或者 char (*pa) [3][100] = &src
3.作用
在函数传参的时候会使用到数组指针
一维数组名用指针来传
二维数组名用一维指针数组来接
三维数组名用三维指针数组来接
四、指针数组
指针数组里定义的指针都是野指针,需要用malloc()来分配空间
1.定义
int *pa[3];
2.初始化:
for(i = 0; i < 3; i++)
{
pa[i] = (int *)malloc(sizeof(int));
scanf("%d", pa[i]);
printf("%d", *pa[i]);
}
3.在定义函数时,数组指针要用指针的指针来接
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- C#动态调整数组大小的方法
- Lua和C语言的交互详解
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#实现将数组内元素打乱顺序的方法
- C#中用foreach语句遍历数组及将数组作为参数的用法
- 详解C#编程中一维数组与多维数组的使用