“这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战”
一维数组
- 数组是一种构造类型,原因是由于数组的成员的个数不同,它占用的内存大小就不相同。
数组的定义格式
char a[5];
int b[3];
复制代码
- a :数组名,a是一个常量,代表数组的首地址
- char [5]:它是数组的类型,有5个char的成员
(关键字sizeof(char [5])) - char :数组中成员的类型
- 成员 :a[0] a[1] a[2] a[3] a[4]
?越界问题:数组不会对越界进行检查,需要工程师自己注意
?内存问题:数组中的成员在内存上是连续的,
a[0]:地址最小
a[4]:地址最大
char a[5]: 5只能是一个常量,不能是变量
数组的赋值问题
1.定义的时候赋值
char a[5] = {'h','e','l','l','o'};
char a[5] = {0}; //===>将数组的所有成员都赋值为0
char a[5];
char a[6] = "hello";//字符串结尾默认包含'\0'
复制代码
2.先定义后赋值
char a[6];
a = {'h','e','l','l','o'}; //错误,因为a是常量
a = "hello"; //错误,因为a是常量
a[0] = 'h';
a[1] = 'e';
a[2] = 'l';
a[3] = 'l';
a[4] = 'o';
复制代码
数组成员访问的方法
char a[] = {'h','e','l','l','o'};
for(i=0;i<sizeof(char [5]);i++){ //for(i=0;i<sizeof(a);i++)
putchar(a[i]);
}
char b[] = "hello";
for(i=0;i<sizeof(char [5]);i++){
putchar(a[i]);
}
printf("%s",a); //%s遇到'\0'才会停止,上面的例子中没有
//'\0'成员,索引不能够使用%s打印内容
复制代码
int t[5] = {1,2,3,4,5};
for(i=0;i<sizeof(int [5])/sizeof(t[0]);i++){
printf("%d",t[i]);
}
复制代码
数组中关于加1移动的问题
char a[5];
int b[10];
- a :数组名,数组的首地址 a = 0xffd8c5d7
- a[0] :数组的首个元素 a[0] = ‘h’
- &a[0] :数组首元素的地址 &a[0] = 0xffd8c5d7
- &a :对整个数组取地址 &a = 0xffd8c5d7
- a++ :错误
- a[0]++ :让首个元素的值加1
- &a[0]++:取出了a[0]的地址,然后让a[0]的值自加了1
- &a++ :错误
- a+1 : 移动了一个元素的大小
- a[0]+1 : a[0]的值加了1
- &a[0]+1: 移动了一个元素的大小
- &a+1 : 移动了整个数组的大小
二维数组
二维数组的定义格式
char a[3][2];
int b[3][2];
数值中的成员:
a[0][0]
a[0][1]a[1][0]
a[1][1]a[2][0]
a[2][1]
二维数组赋初值
char a[3][10] = {“hello”,”sdfsd”,”www”};
//char a[3][2] = “hello”; 错误
char a[3][10] = {"hello","sdfsd","www"};
char a[3][2] = "hello"; ❌
复制代码
a[0][0] = h
a[0][1] = e
a[1][0] = l
a[1][1] = l
a[2][0] = o
a[2][1] = 0
复制代码
char a[3][2] = {'h','e','l','l','o'};
char a[3][2] = {{'h','e'},{'l','l'},{'0',}};
char a[][2] = {{'h','e'},{'l','l'},{'0',}};
?可以省略行下标,但是不能省略列下标
char a[3][] = {{'h','e'},{'l','l'},{'0',}};❌
复制代码
int b[3][2] = {1,2,3,4,5,6};
int b[3][2] = {{1,2},{3,4},{5,6}};
int b[][2] = {{1,2},{3,4},{5,6}};
int b[3][2] = {{1,},{3,4},{5,}};
复制代码
数组成员的访问
char a[3][10] = {"hello","sdfsd","www"};
char b[3][2] = {1,2,3,4,5,6};
for(i=0;i<3;i++){
for(j=0;j<10;j++){
putchar(a[i][j]);
}
putchar(10);
}
puts("-----------------------------------");
for(i=0;i<3;i++){
for(j=0;j<2;j++){
printf("%d\t",b[i][j]);;
}
putchar(10);
}
复制代码
二维数组的常见考法
char b[3][4];
char (b[4])[3];
char t[3]; //t代表b[4]
- b :二维数组的名字,又是二维数组的首地址
- &b[0][0]:二维数组第0个元素的地址
- b[0] :二维数组的第0行的地址
- &b[0] :对第0行取地址
- &b :对二维数组取地址
- b+1 :移动了一行,4个字节
- &b[0][0]+1:移动了一个元素,1字节
- b[0]+1 :移动了一个元素,1字节 //这里移动的是b[0]里的元素
- &b[0]+1 :0移动了一行,4个字节
- &b+1 :移动了整个二维数组的大小是12字节
b = 0x7d37c4,
&b[0][0] = 0x7d37c4,
b[0] = 0x7d37c4,
&b = 0x7d37c4
复制代码
b+1 = 0x7d37c8,
&b[0][0]+1 = 0x7d37c5,
b[0]+1 = 0x7d37c5,
&b[0]+1 = 0x7d37c8,
&b+1 = 0x7d37d0
复制代码
关于数组加1移动的问题
?如果让地址加1,先进行降维,它有多少字节,就移动多少字节
&符号是主动升维运算。
int a[4][3];
-----------|---------|-------|----
int[][4][3]| | | &a
-----------|---------|-------|----
int [4][3] | | &a[0] | a
-----------|---------|-------|----
int[3] | &a[0][0]| a[0] |
-----------|---------|-------|----
int | a[0][0] | |
-----------|---------|-------|----
复制代码
字符数组
?c语言中没有字符串常量,那么如何存储?
方法1:字符数组来存放
方法2:字符型指针来存放
字符数组初始化
char a[] = {‘h’,’e’,’l’,’l’,’o’};
?字符串最后结尾是’\0′
eg “abcd”由5个字符组成
char a[5] = {‘h’,’e’,’l’,’l’,’o’};
char a[6] = “hello”;
char a[6] = {“hello”};
char a[6] = {‘h’,’e’,’l’,’l’,’o’,’\0′};
#include <stdio.h>
void getstr(char arr[],int maxsizeof) //获取字符函数
{
int i = 0;
while((arr[i++] = getchar()) != '\n') { //将字符存入数组arr,遇到换行符结束
if(i > maxsizeof){
break;
}
}
arr[i-1] = '\0';//给arr的最后补上\0
}
int main(int argc, char const *argv[])
{
int i = 0;
int num;
char arr[50] = {0};
printf("请输入一个字符串:");
getstr(arr,sizeof(arr));
printf("arr = %s\n",arr);
return 0;
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END