该笔记整理自 阮一峰老师的《C语言教程》和部分网上资料
声明和初始化数组
// 声明一个数组并初始化
int nums[] = {1, 2, 3, 4, 5};
// 完整写法: int nums[5] = {1, 2, 3, 4, 5};
// 数组长度可以省略,因为长度系统可以判断出来
// 声明一个长度为5的数组
int nums[5];
// 相当于 int nums[] = {0, 0, 0, 0, 0};
// 声明一个长度为5的数组,并指定部分位置的元素值
int nums[5] = {[2] = 10, 11};
// 相当于 int nums[] = {0, 0, 10, 11, 0};
当数组被声明后,数组的起始地址就被锁定了,就不能更改了
int nums[] = {1, 2, 3};
int nums01[3] = nums; // 报错,试图让nums01重新指向nums的空间
int nums[5]; // 相当于 int nums[] = {0, 0, 0, 0, 0};
nums = {1, 2, 3, 4, 5}; // 报错,试图让nums重新指向其他空间
int nums[10] = NULL; // 报错,尝试让nums重新指向NULL
int nums01[] = NULL; // 报错,nums01没有长度
获取数组长度
int nums[] = {1, 2, 3, 4, 5};
printf("%zd", sizeof(nums) / sizeof(int));
// 这里其实也可以让%d作占位符,但是为了防止溢出,建议使用%zd或%zu
数组指针
int nums[5];
int* numsp = nums; // 等同于 int* numsp = &nums[0];
数组名是一个指针,是指向其第一个元素的指针
int nums[] = {10, 2};
printf("%d", *nums); // 10
printf("%d", *(nums + 1)); // 20
注意,千万不要这么做
int nums[] = {10, 2};
nums ++;
// 相当于 nums = nums + 1; 即 让nums的第一个元素地址指向第二个元素地址
数组克隆
如果想让两个数组指向同一个空间
int nums[] = {1, 2, 3, 4};
int* numsCopied = nums;
如果想要两个相互独立的数组
int nums[] = {1, 2, 3, 4};
size_t numsLen = sizeof(nums) / sizeof(int);
int numsCopied[numsLen];
int i;
for (i = 0; i < numsLen; i ++) {
numsCopied[i] = nums[i];
}
或者
include <stdio.h>
include <string.h>
int main() {
int nums[] = {1, 2, 3, 4};
int numsCopied[4];
// memcpy参数分别为: 目标数组/指针,资源数组/指针,拷贝的字节数
memcpy(numsCopied, nums, sizeof(nums));
}
多维数组
// 声明并初始化多维数组
int arr[][4] = {{1, 2, 3, 4}, {1, 2, 43, 4}};
// 此时,多维数组第一维的长度可以省略,但是其他维度的数组长度无法省略
int arr[3][4]; // 此时,任何维度的长度都不能省略
数组参数
当我们把一个数组作为形参时,应该再设置一个数组长度的形参
因为数组名就是指向其第一个元素的指针,如果单单传一个数组,那么函数只知道数组的起始地址,不知道数组的结束地址
void fn(int arr[5]) {}
// 这个写法合法,但是arr会被认成指针,arr数组的长度在函数内部也是无法获取的
// 正确的写法应该是
void fn(int arr[], int len) {}
如果形参数组为多维数组
第一维数组的长度可以通过其他参数传递
但是其他维度的长度需要写在中括号里
int sum(int arr[][5], int arrLen)
当数组字面量作为参数时,我们需要将字面量进行强转
fn((int []){1, 2, 3}, 3);
标签:10,arr,nums,int,笔记,C语言,数组,长度
From: https://www.cnblogs.com/LanceWorkstaion/p/18311366