文章目录
前言
无论是数组还是字符串,使用它们的过程中不可避免的要是用到C语言的灵魂功能指针,研究各类数组时面对的更多的是对指针的正确操控,这篇文章将分享在学习c语言过程中不断出现的数组问题,如有纰漏评论区留言。
一、数组是什么?
数组(Array)是大部分编程语言都会提供的一种有序的元素序列。功能是将有限的类型相同的变量统一集合并且命名,那么这个名称为数组名。组成数组的各个变量都是数组的元素,或称为下表变量。
(2021/7/10号更新)
值得注意的是数组名可以认为是数组首地址,类型为常量指针。在二维数组中函数名成为了这个二维数组中第一个一维数组的地址arr==&arr[0].
事实上在二维数组中
arr的值可以等值于 arr[0] &arr[o] &arr[0][0]
arr+2的值可以等值于 &arr[2] arr[2] &arr[2][0]
二、数组的定义和初始化以及问题
1.数组的定义和初始化
一维数组定义 初始化
//如果下标运算符有数据
基本数据类型通用
1. type_name arr[6]; //元素有6个 系统随机分配的垃圾值(就算是bool类型) 数组长度为6.
2. type_name arr[5]={}; //元素有5个 元素全部为0 数组长度为5.
int类型(float double long同理)
1. int arr[3]={1,2,3}; //元素有3个 数组长度为3 .
2. int arr[4]={1,2,3}; //元素有4个 arr[3]未被赋值默认为0 数组长度为4.
char类型
1. char arr[3]={"hi"}; //元素有3个 'h' 'i' '\0' ('\0'作为结束符自动补上) 数组长度为3.
2. char arr[3]="dog"; //元素有3个 'd' 'o' 'g' 由于数组长度限制'\0'无法补上 数组长度为3.
3. char arr[6]={'H','E','L','L','O'}; //元素有6个 'H','E','L','L','O','\0' 数组长度为6.
//以上三种三种赋值运算符右边的写法都是允许切自动补'\0' **
值得注意的是 “Hello” 可以被 "Hel""lo"代替 **
//如果下标运算符无数据
基本数据类型通用
1. type_name arr[]={}; //会有一个元素 如果去掉 ={} 则会报错
int类型(float double long同理)
1. int arr[]={1,2,3}; //元素有3个 1,2,3 数组长度为3 .
char类型
1. char arr[]={"HI"}; //元素有3个 'H' 'I' '\0' ('\0'作为结束符自动补上) 数组长度为3
2. char arr[]={'H','E','L','L','O'}; //元素有6个 'H','E','L','L','O','\0' 数组长度为6
二维数组定义 初始化
// 一般而言arr[A][B]中,A代表行,B代表列 A可以为空但是B一定要有值 并要赋值或={}
//如果两个下标运算符中都有数据
基本数据类型通用
1. type_name arr[3][3]; //元素有9个 系统随机分配的垃圾值(就算是bool类型) 数组行数为3列数为3.
2. type_name arr[5][5]={}; //元素有25个 元素全部为0 数组行数为5.
int类型(float double long同理)
1. int arr[3][3]={1,2,3}; //元素有9个 arr[0][0]到arr[0][2]分别存储1,2,3其余元素都是0 数组长度为3 .
2. int arr[3][3]={{1,2},{3,4},{5,6}};
//元素有9个
//arr[0][0]存储1 arr[0][1]存储2 arr[0][2]存储0
//arr[1][0]存储3 arr[1][1]存储4 arr[1][2]存储0
//arr[2][0]存储5 arr[2][1]存储6 arr[2][2]存储0 (\0本质就是0)
char类型
1. char arr[3][3]={"who","am","i"}; //{}中的单个字符串不能比列宽长
//arr[0][0]存储'w' arr[0][1]存储'h' arr[0][2]存储'o'
//arr[1][0]存储'a' arr[1][1]存储'm' arr[1][2]存储'\0'
//arr[2][0]存储'i' arr[2][1]存储'\0' arr[2][2]存储0 (\0的ascll码就是0)
//值得注意的是由于printf(%s,arr)输出是到\0截止,而二维数组两个相邻的元素的地址也是相邻的即arr[0][2]的地址和arr[1][0]的地址也是相邻,如果使用printf("%s",arr[N]); 0<=N<=2 如N=0 则会输出whoam.
2. char arr[3][3]="whoami"; //错误 "whoami"作为字面值字符串无法放入二维数组
3. char arr[3][3]={'H','E','L','L','O'};
//arr[0][0]存储'H' arr[0][1]存储'E' arr[0][2]存储'L'
//arr[1][0]存储'L' arr[1][1]存储'O' arr[1][2]存储'\0' (\0的ascll码就是0)
//如果两个下标运算符中都有数据
基本数据类型通用
1. type_name arr[][3]; //编译不通过 缺少二维数组行数
2. type_name arr[][5]={}; //元素有5个 全部为垃圾值 数组行数为1.
3. type_name arr[][]={}; //编译不通过 没有元素列宽
int类型(float double long同理)
1. int arr[][3]={1,2,3,4}; //元素有6个 如果一行中的元素超过3行数会加一继续写入
//arr[0][0]存储1 arr[0][1]存储2 arr[0][2]存储3
//arr[1][0]存储4 arr[1][1]存储0 arr[1][2]存储0
2. int arr[][3]={{1,2},{},{1,3}};
//arr[0][0]存储1 arr[0][1]存储2 arr[0][2]存储0
//arr[1][0]存储0 arr[1][1]存储0 arr[1][2]存储0
//arr[2][0]存储1 arr[2][1]存储3 arr[2][2]存储0 (\0的ascll码就是0)
char类型
1. char arr[][3]={"who","","i"}; //{}中的单个字符串不能比列宽长
//arr[0][0]存储'w' arr[0][1]存储'h' arr[0][2]存储'o'
//arr[1][0]存储'\0' arr[1][1]存储'\0' arr[1][2]存储'\0'
//arr[2][0]存储'i' arr[2][1]存储'\0' arr[2][2]存储'\0' (\0的ascll码就是0)
2. char arr[][3]="whoami"; //错误 同上
3. char arr[][3]={'H','E','L','L','O'};
//arr[0][0]存储'H' arr[0][1]存储'E' arr[0][2]存储'L'
//arr[1][0]存储'L' arr[1][1]存储'O' arr[1][2]存储'\0'
2.对数组的指针使用
基本数据类型通用
1.Type_Name arr[10];
Type_Name * p = arr; //数组要被同一类型的指针存储
void * p = arr; //万能指针可以存储各类数组头地址
// printf("%?",*(Type_Name *)p); ** %?需要和Type_Name对应**
Type_Name arr[5][10];
Type_Name (* pa)[10]=&(&arr[1])[0];
Type_Name (* pa)[10]=arr+1;
Type_Name (* pa)[10]=&arr[1];
//由于数组指针只能指向一个数组宽度为10的数组的指针
3.存储在全局数据区的数组们遇到的问题
//全局数组的定义 linux gcc编译器
#include<stdio.h>
#define N 10
const n=10
int arr1[N]; //编译通过
int arr2[n]; //编译错误 存储在静态全局区的数组在定义时 元素长度必须是常量 不能是变量或只读变量 (C++会允许)
int main()
{
//如果下标运算符内有内容
int arr2[N]; //编译通过
int arr3[n]; //编译通过
static int arr4[n]; //编译错误 静态数组也存储在静态全局区 (C++会允许)
return 0;
}
总结
2021/5/31日更新