C的数组概念
一、一维数组1.1 概念数组是一组相同数据类型的元素的集合这些元素在内存中是连续存储的并且通过一个唯一的数组名称和索引来访问。1.2 定义一维数组的定义语法格式数据类型 数组名 [元素个数];1.3 访问与操作1.3.1 访问访问数组元素通过下标索引来访问数组的每个元素数组下标从0开始。numbers[0] 10;//将10赋值给数组的第一个元素printf(%d, numbers[0]);//输出第一个元素的值数组遍历使用循环遍历数组的所有元素for(inti 0; i 5; i) {printf(%d , numbers[i]);}数组的元素个数计算方式数组占的总字节数除以类型占的字节数sizeof(numbers)/sizeof(int)或者sizeof(arr)/sizeof(arr[0]1.3.2 操作1.声明时显式初始化在声明数组时可以显式地为每个元素赋值。如intarr[5] {1, 2, 3, 4, 5};2.部分初始化当初始化的元素少于数组大小时未显式赋值的元素会被默认初始化为0。如intarr[5] {1, 2};3.不指定数组大小由编译器推断可以不指定数组的大小编译器会根据初始化列表自动推断数组的大小。如intarr[] {1, 2, 3, 4, 5};4.使用for循环逐一赋值在数组声明之后可以使用for循环或其他方式为数组逐一赋值int arr[5]; for(int i 0;i 5; i){ arr[i] i 1; }5.静态初始化在声明静态数组时未显示格式化的元素会自动初始化为0ststic int arr[5];6.全部初始化为0可以通过只指定大括号而不提供具体值将数组的所有元素初始化为0。如intarr[5] {0};1.4 好处1.节省代码空间避免重复定义变量2.方便批量操作3.数据的集中存储与管理4.提高代码的可读性和可维护性5.与算法和数据结构的结合6.高效的随机访问7.减少内存管理的复杂性注数组的指针数组在内存中的存储数组元素在内存中是连续存储的因此可以通过指针访问相邻元素。假设数组int numbers[5]存储在内存中其首元素numbers[0]的地址为numbers[0]那么numbers[1]的地址为numbers[0] 1。数组名可以直接当作指针使用通过指针访问数组元素int numbers[5] {10, 20, 30, 40, 50}; int*ptr numbers; printf(%d, *(ptr 1));//输出numbers[1]的值。数组越界数组越界访问超过数组大小范围的索引数组越界是危险的可能导致程序崩溃或意外行为。二、字符数组2.1 概念字符数组是用于存储字符序列的数组每个元素是一个字符类型char。字符数组通常用于表示字符串但本质上它只是字符的集合。2.2 定义声明语法chararray_name[size];示例char name[10];//声明一个长度为10的字符数组显式初始化可以直接在声明时为字符数组赋值。(单个存字符)单引号示例char name[5] {H, e, l, l, o};数组name存储字符序列Hello不是字符串没有结束符不会自动加上字符串结束符\0。字符串初始化使用字符串字面量直接初始化字符数组。双引号示例chargreeting[] Hello;自动在末尾添加字符串结束符\0。字符串初始化时数组的大小可以不显式指定编译器会自动推导。2.3 常见操作不可直接赋值字符串数组不能像基本数据类型那样通过直接赋值的方式进行赋值。例如下面的代码是错误的char str[20]; str Hello;//错误不能直接给字符数组赋值因为Hello相当与字面常量地址str也相当于一个地址。两个地址不能相等使用strcpy()函数;专门用来复制字符串从一个地址找\o然后复制字符串给地址strcpy(str,p);//把p地址内容给str地址复制过去一段字符串有\0使用sprintf()函数;格式化输给数组char str[20]; int i 10; sprintf(str,%d,i);//把i的内容传给str //把i的数据类型自动转化成字符类型使用memcpy()函数;把一个内存空间内的数据复制给一个地址复制这段地址以下的多少个字节给目标地址char str[20]; char i a; memcpy(str,i,1);//把i的一个字节给str只负责拷贝对应字节的东西最好字符数加1需要\0如果数组后面的是0则可以打印出来如果不是则会带后面的东西使用scanf和printf处理字符数组。示例char name[50]; printf(Enter your name: ); scanf(%s, name);//读取字符串自动处理\0 printf(Hello, %s!\n, name);字符数组中的字符串操作使用标准库函数如strlen判断字符串长度strcpy复制字符串strcat字符串拼接strcmp按ASCII值比较两个字符串等于返回0小于返回负大于返回正来操作字符数组中的字符串。示例#includestdio.h #includestring.h int main() {char first[20] Hello; char second[20] World; strcat(first, second);//字符串拼接 printf(%s\n, first);//输出: HelloWorld return0; }2.4 常见问题数组大小限制字符数组必须有足够的空间存储所有字符以及字符串结束符\0。示例错误char small[5] Hello;//错误需要6个字符包括\0数组越界字符数组操作时要注意避免越界访问。示例错误char name[10]; name[10] A;//越界name[10]不可访问处理输入中带有空格的字符串使用gets()已废弃或fgets()函数来读取包含空格的字符串。示例char sentence[100]; fgets(sentence, 100, stdin);//读取一行输入字符串数组判断是否为空字符串空字符串的第一个字符就是 \0if (str[0] \0)三、 二维数组3.1 概念定义二维数组是相同类型的多行多列数据的集合类似于一个表格矩阵。3.2 语法语法type array_name[rows][cols];示例int ar[3][4];——定义了一个3行4列的二维数组。内存布局二维数组在内存中是线性存储的存储顺序是按行优先3.3 访问和操作声明int ar[3][4];——声明一个3行4列的整数数组未初始化内容为随机值。初始化显式初始化int ar[2][3] {{1, 2, 3}, {4, 5, 6}};部分初始化int ar[2][3] {{1}, {4}};其余元素初始化为0隐式大小推断int ar[][3] {{1, 2, 3}, {4, 5, 6}};隐式大小推断时必须指定列数行数可以根据初始化内容自动推断。访问二维数组元素语法array_name[row][col];示例int value arr[1][2];——访问数组第二行第三列的元素。修改二维数组元素语法array_name[row][col] value;示例arr[0][1] 10;——修改数组第一行第二列的值为10。使用嵌套循环遍历二维数组外层循环遍历行内层循环遍历列。示例for(int i 0; i 3; i) { for(int j 0; j 4; j) { printf(%d , arr[i][j]); } printf(\n); }逐个元素赋值通过嵌套循环对二维数组进行逐个元素赋值。示例for(inti 0; i 3; i) { for(intj 0; j 4; j) { arr[i][j] i j;} }二维数组的拷贝操作可以使用memcpy函数来拷贝整个二维数组的数据块。示例memcpy(arr2, arr1, sizeof(arr1));//将arr1的内容拷贝到arr23.4 二维数组与指针的关系二维数组名作为指向首行的指针arr是指向arr[0]的指针arr[0]又是指向第一行的指针。(int *)arrarr[0]arr[0][0]一维数组就不需要强转二维数组需要强转一下才能表示地址一维数组名退化为指向元素类型的指针int*1移动一个元素二维数组名退化为指向一维数组的指针int (*)[N]1移动一整行一二维数组都是常量指针。通过指针访问二维数组元素可以通过指针偏移来访问二维数组中的元素。示例int*ptr arr[0][0]; printf(%d\n, *(ptr 1));//访问arr[0][1]arr[1]是指针指向第二行首元素所以打印的时候要解引用通过指针访问它所指向的变量的值printf(%d, *arr[1]);arr[1][1]是整数第二行第二列的元素值不需要解引用直接赋值就可以
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419545.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!