C语言数组基础知识

目录

一维数组:

一维数组的创建:

一维数组的访问:

一维数组在内存中的存储:

二维数组:

二维数组的创建:

二维数组的初始化:

二维数组的使用:

二维数组在内存中的存储:

数组作为函数参数:

但是,数组名是首元素地址的情况有两个例外:

冒泡排序的实例应用:


一维数组:

一维数组的创建:

数组是一组相同类型的元素的集合。

type_t arr_name[const_n];

type_t是指数组的元素类型

const_n是一个常量表达式(不能初始化变量n作为常量表达式,只有C99标准支持变长数组),用来指定数组的大小

int arr[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr[10]={1,2,3,4,5};//不完全初始化,后面的值为0;
int arr[]={1,2,3,4,5};   //等价于 int arr[5]={1,2,3,4,5};  
char ch[]={'b','i','t'};//三个元素
char ch[]=“bit”;//四个元素,因为字符串末尾自带'\0'
int main() {
	char ch1[] = "bit";
	char ch2[] = { 'b','i','t' };
	printf("%s\n", ch1);
	printf("%s\n", ch2);

	return 0;
}

这段代码的运行结果为:

原因是字符串“bit”中有结束字符‘\0’.而ch2中没有结束字符导致继续读取随机值(这种情况下求字符串长度也会出错)


一维数组的访问:

(1)数组是使用下标来访问的,下标是从0开始的

(2)数组的大小可以通过计算得到

int sz = sizeof(arr) / sizeof(arr([0]));

一维数组在内存中的存储:

//%p - 是按地址的格式打印 - 十六进制的打印
int main() {
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++) {
		printf("arr[%d]=%p\n", i, &arr[i]);
	}
	return 0;
}

这段代码运行结果为:

所以:

(1)一位数组在内存中是连续存放的(所以可以用指针访问)

(2)随着数组下标的增长,地址是由低到高变化的


二维数组:

二维数组的创建:

int arr [3][4];
char arr[3][4];


二维数组的初始化:

int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化

int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化

int arr[3][4] = { {1,2},{3,4},{5,6} };//每行填充两个元素
//因为初始化了三行,所以可以省略行数
//所以等价于int arr[][4] = { {1,2},{3,4},{5,6} };


二维数组的使用:

int main() {
	//int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
	//int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化
	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果为:


二维数组在内存中的存储:

int main() {

	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("arr[%d][%d]=%p\n", i,j,&arr[i][j]);
		}
	}
	return 0;
}

运行结果为:

所以:

(1)二维数组在内存中也是连续存放的(行内部连续,跨行也是连续的)

如图:

(2)二维数组也可以定义指针访问


数组作为函数参数:

数组作为函数参数传入,传入的是数组首元素的地址,等价于指针

int main() {
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);

	return 0;
}

运行结果为:

但是,数组名是首元素地址的情况有两个例外

(1)sizeof(数组名) 数组名表示整个数组-计算的是整个数组的大小,单位是字节

但在函数中接受传入的形参数组时,sizeof(形参数组)计算的是数组首地址元素的大小, 这一块具体可查看博主的相关博客C中关于能否在函数中求传入整型数组长度的问题

(2)&数组名 - 数组名表示整个数组 - 取出的是整个数组的地址(但与数组首元素地址一样,但意义不同),这一块具体可查看博主的相关博客C中数组名代表首元素地址的两个例外

冒泡排序的实例应用:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include<stdlib.h>
#include <stdbool.h> 
void bubble(int brr[], int len) {
	for (int i = 0; i < len - 1; i++) { //一共进行几趟冒泡排序
		bool flag = false;              //用于判断本趟冒泡排序是否发生了元素的交换
		for (int j = len - 1; j > i; j--) {//每趟冒泡排序要进行几次交换
			if (brr[j] > brr[j - 1]) {
				int tmp = brr[j - 1];
				brr[j - 1] = brr[j];
				brr[j] = tmp;             //交换元素
				flag = true;              //本趟排序发生了元素的交换
			}
			if (flag == false) {
				return;
			}
		}
	}
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz);
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果为:

相关推荐

  1. c语言基础知识

    2024-01-13 20:22:01       38 阅读
  2. C语言基础知识笔记

    2024-01-13 20:22:01       20 阅读
  3. C语言数组基础

    2024-01-13 20:22:01       20 阅读
  4. c语言指针基础知识

    2024-01-13 20:22:01       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-13 20:22:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-13 20:22:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-13 20:22:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-13 20:22:01       20 阅读

热门阅读

  1. python爬虫,发送请求需要携带cookies

    2024-01-13 20:22:01       39 阅读
  2. 允许一切发生

    2024-01-13 20:22:01       35 阅读
  3. 【重点!!!】【DP】354. 俄罗斯套娃信封问题

    2024-01-13 20:22:01       41 阅读
  4. 第十讲_css2d转换

    2024-01-13 20:22:01       43 阅读
  5. Rust 宏的使用

    2024-01-13 20:22:01       38 阅读
  6. 一体机旅游景区污水处理设备工艺说明

    2024-01-13 20:22:01       41 阅读
  7. SpringBoot ObjectMapper 返回json 指定字段排序

    2024-01-13 20:22:01       45 阅读
  8. docker配置nginx

    2024-01-13 20:22:01       35 阅读
  9. 问题在于qsize是常量

    2024-01-13 20:22:01       36 阅读
  10. 程序员大学毕业后如何发展?

    2024-01-13 20:22:01       39 阅读
  11. C/C++利用指针输出二维数组元素

    2024-01-13 20:22:01       39 阅读
  12. Pinia store如何做模块化

    2024-01-13 20:22:01       36 阅读
  13. 学习记录之JVM

    2024-01-13 20:22:01       42 阅读