C++学习:第二章C语言基础 - (六)数组

版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82770454

1. 数组

int a[10] = {1,2,3,4,5,6,7,8,9,0};

注意,数组名是存放第一个元素的地址。

int mian(){

    int a[5] = {1,2,3,4,5};
    printf(“a=%p\n”, a);

    for(int i=0; i<5; i++){
        printf(“&a[%d] = %p\n”, i, &a[i]);}

    *a += 100;
    printf(“%d  %p   %p \n”, a[0], &a, &a[0]);

    for(int i=0; i<5; i++){
         printf(“%d  %d  %p  %p \n”, a[i], *(a+i), &a[i], (a+i));}

    return 0;
}

这里没写数据越界的例子,数据越界会影响其他数据的值,甚至是程序崩溃

 

2. 字符串

字符串在存储时,每个字符串结束后都会有\0

如果按照%s 输出%c 可能会输出乱码

可以 char a[] = {‘a’, ‘b’, ‘\0’};

 

3. 数组的长度

int a[5][10] 有一个int型的数组,长度是5,其中每个元组又是一个int [10]的数组

int a[3][5] = {{1,2}, {3}, {4,5}}; a[0]与a[1]之间的地址相差4*5=20字节

因此 int a[3];如果a[0]的地址是0x0,那么a[1]的地址就是0x4,因为int占4个字节

4. 数组的地址

对比以下两种写法:

int main(){

         char a[100] = {"qwertyuioplkjhgfdsazxcvbnm"};
         char *b = &a[5];

         printf("%s\n", b);        

         return 0;
}
#include<stdio.h>

int main(){

         char a[8] = {'q','w','e','r','t','y','u','m'};
         char *b = &a[5];

         printf("%c\n", a[5]);
         printf("%s\n", b);
         
         printf("%s\n", a);
         printf("%s\n", a)[0];
         printf("%s\n", &a[0]);
        
         return 0;
}

1. 数组的两种写法,第一个和第二个,输出结果都是从第五个元素一直输出到末尾。

2. 为什么数组、地址分不开?因为数组就是一个连续的内存地址,并返回首地址,因此char a[8] 和 char *b没有什么本质区别,都是一个数组,只是一个长度固定,一个长度不固定。

3. char *b = &a[5]; 这句话是说对a数组偏移5个位置,并返回他的地址给b,作为b数组的首地址。因此在输出时寻址输出。

5. 数组的初始化

数组的初始化有两种:先声明后初始化和声明同时初始化。

这里需要注意的是,声明后默认值为\0,正好是字符串的结束标识符,因此

char a[9] = {‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’ };这样写肯定不会有乱码

puts(a);

char a[8] = {‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’ };这样写肯定会有乱码

puts(a);

猜你喜欢

转载自blog.csdn.net/kakiebu/article/details/82770454