Linux及C语言高级[5](C语言数组)

“这是我参与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
喜欢就支持一下吧
点赞0 分享