免费网站app生成软件,济南今天发生的重大新闻,微信存储wordpress,中国建筑公司网站大全1、概述
数组是在内存中连续的相同类型的变量空间数组属于构造数据类型
//数组定义
//数据类型 数组名[元素个数]{值1#xff0c;值2#xff0c;值3#xff0c;……};
int arr[10]{9,8,7,6,5,4,3,2,1,0};//元素访问
//数组名[下标]
//数组下标从0开始
for(int i0;i)
{prin…1、概述
数组是在内存中连续的相同类型的变量空间数组属于构造数据类型
//数组定义
//数据类型 数组名[元素个数]{值1值2值3……};
int arr[10]{9,8,7,6,5,4,3,2,1,0};//元素访问
//数组名[下标]
//数组下标从0开始
for(int i0;i)
{printf(%d\n,arr[i]);
}//数组在内存中的存储方式和大小
for(int i0;i10;i)
{printf(%p\n,arr[i]);
}printf(%p\n,arr);printf(数组在内存中占的大小%d\n,sizeof(arr));
printf(数组元素在内存中占的大小%d\n,sizeof(arr[0]));
printf(数组元素个数%d\n,sizeof(arr)/sizeof(arr[0]));数组在内存中是连续存储的地址连续数组名是一个指向数组首地址的地址常量数组在内存中占的大小数组类型*元素个数
2、数组的定义和使用
# 数组定义的方式
int arr1[10]{9,8,7,6,5,4,3,2,1,0};
int arr2[]{9,8,7,6,5,4,3,2,1,0}; //自动得到数组长度为10
int arr3[10]{1,2,3}; // 前三个分别为1 2 3 其余为0
int arr4[10]{0}; //所有元素都为0
int arr5[10]{1}; //第一个为1其余为0int arr6[10]; //定义了没有赋值内部的数据不确定一般会乱码
arr6[0]1; //第一个为1其余依然乱码int arr[]; //在这种写法不可以//这种写法不可以数组定义的时候数组长度必须是常量或者常量表达式
//数组必须预先知道大小
//动态数组 开辟堆空间
int i10;
int arr[i];//从键盘获取数组元素值
int arr7[10];
for(int i0;i10;i){scanf(%d,arr7[i]);
}
数组下标越界可能会报错但是越界后访问到的内容不确定。下标越界编译器不会报错
3、数组逆置
int arr[10]{1,2,3,4,5,6,7,8,9,10};
int i0;
int jsizeof(arr)/sizeof(arr[0]);
while(ij)
{//通过临时变量交换数据int temparr[i];arr[i]arr[j];arr[j]temp;i;j--;
}
4、冒泡排序
//内层比较次数为元素个数-1-执行次数
//外层执行次数为元素个数-1
int arr[]{9,1,5,7,2,10,8,4,6,3};
for(int i0;i10-1;i)
{for(int j0;i10-1-i;j){if(arr[j]arr[j1]){//通过大于或者小于号控制升序或者降序int temparr[j];arr[j]arr[j1];arr[j1]temp;}}
}5、二维数组
5.1、二维数组的定义和使用
// 一维数组数据类型 数组名[元素个数]{值1值2……}
// 二维数组数据类型 数组名[行数][列数]{{值1值2……},{值1值2……},{值1值2……},……}
int arr[2][3]{{1,2,3},{4,5,6}};arr[1][2]20;
for(int i0;i2;i)
{for(int j0;j3;j){printf(%d ,arr[i][j]);}printf(\n);
}printf(二维数组的大小%d\n,sizeof(arr));
printf(二维数组一行的大小%d\n,sizeof(arr[0]));
printf(二维数组的元素大小%d\n,sizeof(arr[0][0]));printf(二维数组的行数%d\n,sizeof(arr)/sizeof(arr[0]));
printf(二维数组的列数%d\n,sizeof(arr[0])/sizeof(arr[0][0]));//二维数组首地址
//下面三个语句的输出结果一样
printf(%p\n,arr);
printf(%p\n,arr[0]);
printf(%p\n,arr[0][0]);//数组的第二行的首地址
printf(%p\n,arr[1]);//二维数组初始化
int arr[2][2]{1,2,3,4,5,6}; //等价于 int arr[2][3]{{1,2,3},{4,5,6}}; 但是一般不要这么写不方便维护//int arr[2][3]
int arr[][3]{1,2,3,4,5,6}; //int arr[3][3]
int arr[][3]{1,2,3,4,5,6,7}; //二位数组初始化的时候列数不能省略只能省略行
5.2、二维数组的应用
//定义一个二位数组存储五名学生三门成绩arr[5][3]
//求出每名学生的总成绩平均成绩
//求出每门课的总成绩平均成绩
int arr[5][3];//输入成绩
for(int i0;i5;i)
{for(int j0;j3;j){scanf(%d,arr[i][j]);}
}
//输出成绩
for(int i0;i5;i)
{for(int j0;j3;j){printf(%d,arr[i][j]);}
}//计算每名学生的总成绩和平均成绩
for(int i0;i5;i)
{int sum0;for(int j0;j3;j){sumarr[i][j];}int averagesum/3;
}//计算每门课的总成绩和平均成绩
for(int i0;i3;i)
{int sum0;for(int j0;j5;j){sumarr[i][j];}int averagesum/5;
}6、多维数组
6.1、多维数组的定义
// 一维数组数据类型 数组名[元素个数]{值1值2……}
// 二维数组数据类型 数组名[行数][列数]{{值1值2……},{值1值2……},{值1值2……},……}
//多维数组声明数组类型 数组名[n1][n2]……[nn];
int arr[2][3][4]{{{1,2,3,4},{2,3,4,5},{3,4,5,6}},{{4,5,6,7},{5,6,7,8},{6,7,8,9}}};
for(int i0;i2;i)
{for(int j0;j3;j){for(int k0;k4;k){printf(%d ,arr[i][j][k]);}printf(\n);}printf(\n);
}//三维数组的大小
printf(三维数组的大小%d\n,sizeof(arr));
printf(三维数组一层的大小%d\n,sizeof(arr[0]));
printf(三维数组一行的大小%d\n,sizeof(arr[0][0]));
printf(三维数组元素的大小%d\n,sizeof(arr[0][0][0]));//三维数组的层数
printf(三维数组的层数%d\n,sizeof(arr)/sizeof(arr[0]));
printf(三维数组的行数%d\n,sizeof(arr[0])/sizeof(arr[0][0]));
printf(三维数组的列数%d\n,sizeof(arr[0][0])/sizeof(arr[0][0][0]));//三维数组定义的时候层数可以省略
//高维数组定义的候第一个维度可以省略
int arr[][3][4]{0}//四维数组
int arr[2][3][4][5]{1,2,3};
//元素个数2*3*4*57、字符数组和字符串
7.1、字符数组与字符串的区别
//定义字符数组
char arr[6]{h,e,l,l,o,0}; //此时不是字符串只是字符数组
char arr2[5]{h,e,l,l,o};
//字符
char chh;
//字符串 字符串结束标志位 \0
char *strhello;
char arr1[]{h,e,l,l,o,\0}; //此时就是字符串了数字0等同于 \0,但是不等同于 0
printf(%s,arr1);
printf(%s,arr2); //不会报错但是输出会乱码printf(%d\n,sizeof(arr));//可以通过字符的ASCII码进行字符数组的初始化但是下面的初始化末尾没有\0因此输出完前7个字符之后后面会乱码直到遇到内存中的\0为止
char ch3[]{110,111,112,101,123,98,99};
printf(%s,ch3);char ch4[]{hello}; //也可以不要大括号也可以
7.2、字符数组存储字符串
//定义字符数组存储字符串
char ch[10];//输入helloworld 会报错
//输入helloworl 会正常输入输出
//输入hellowo 会正常输入输出
//输入hello wor会输出hello
scanf(%s,ch); //在输入字符串的时候长度超过9个会报错printf(%s,ch);拼接两个字符串
char ch1[]hello;
char ch2world;
char ch3[30];//字符串拼接
int i0;
int j0;
while(ch1[i]!\0)
{ch3[i]ch1[i];i;
}
while(ch2[j]!\0)
{ch3[ij]ch2[j];j;
}
ch3[ij]\0;printf(%s,ch3);7.3、字符串输入输出
char ch[10];//可以在输入的时候对字符串长度进行限定这里输入超过9个字符就不会报错但是实际输入只有九个字符输出也只有9个字符
scanf(%9s,ch);
printf(%s,ch);
1gets() 函数从标准输入读入字符并保存到指定的内存空间直到出现换行符或读到文件结尾为止
char *gets(char *s);
参数s字符串首地址返回值成功读入的字符串失败NULLgets(str) 和 scanf(“%s”,str) 的区别 gets(str) 允许输入的字符串含有空格scanf(“%s”,str) 不允许含有空格
# include stdio.h
char ch[100];
char ch2[100];//通过键盘获得一个字符串
//gets() 接收字符串可以带空格
//scanf 可以通过正则表达式来接收空格
scanf(%[^\n],ch);
gets(ch);
printf(%s,ch);注由于 scanf() 和 gets() 无法知道字符串的大小必须遇到换行符或者读到文件结尾为止才接收输入因此容易导致数组越界缓冲区溢出的情况。
2fgets() 函数从 stream 指定的文件内读入字符保存到所指定的内存空间直到出现换行字符、读到文件末尾或是读了 size-1 个字符为止最后会自动加上 ‘\0’ 字符作为结束标志。
# includestdio.h
char *fgets(char *s, int size,FILE *stream);参数 s字符串size指定最大读取字符串的长度size-1stream文件指针如果读取键盘输入的字符串固定写作 stdin 返回值 成功成功读取的字符串读到文件尾或者出错NULL fgets() 在读取一个用户通过键盘输入的字符串的时候同事把用户输入的回车也作为字符串的一部分。通过 gets() 和 scanf() 输入一个字符串的时候不包含结尾的 ‘\n’但通过 fgets() 结尾多了 ‘\n’。fgets() 函数是安全的不存在缓冲区溢出的问题fgets() 函数可以接收空格和换行fgets() 函数获取字符串长度短于元素个数会有 ‘\n’大于则没有
char ch[10];fgets(ch,sieof(ch),stdin);
printf(%s,ch);3puts () 函数从标准输出设备输出字符串在输出完成后自动输出一个 ‘\n’
#includesrdio.h
int puts(const char *s);参数s字符串首地址返回值成功非负数失败-1
char ch[]hello world;//puts() 自带换行
puts(ch);puts(hello\0 world); //输出结果为hello输出的时候遇到 \0 停止
4fputs() 函数将 str 所指定的字符串写入到 stream 指定的文件中字符串结束符 ‘\0’ 不写入文件
#includestdio.h
int fputs(const char *str,FILE *stream);参数 str字符串stream文件指针如果把字符串输出到屏幕固定写为 stdout 返回值成功0失败-1fputs() 是 puts() 的文件操作版本但是 fputs() 不会自动在末尾输出一个 ‘\n’
char ch[]hello world;
fputs(ch,stdout);7.4、字符串的长度
1strlen() 函数计算指定字符串 s 的长度不包含字符串结束符 ‘\0’
#include string.h
size_t strlen(const char *s);参数s字符串首地址返回值字符串 s 的长度size_t 为 unsigned int 类型
//计算字符串有效长度
char ch[100]hello world;
printf(数组大小%d,sizeof(ch)); //100
printf(字符串大小%d,strlen(ch)); //11char ch1[]hello world;
printf(数组大小%d,sizeof(ch1)); //12
printf(字符串大小%d,strlen(ch1)); //11char ch1[]hello world;
int len0;while(ch[len]!\0)
{len;
}
printf(字符串的长度%dlen);