6.2字符串数组的二维数组形式和指针数组形式

二维数组形式的字符串数组

char sa[][10] = {"beijing","tianjing","shanghai',"chongqing"}; //二维数组第二个[]是必须定义大小的

注意!!!:

strcpy(str[0], "hebei"); //可以修改!

strcpy[0][1] = 'E'; //也可以修改!

但是!!!!!!

strcpy[0] = "hebei"; //不允许修改!!!!

因为二维数组里的每一格一维数组名是一个指针常量,其地址不允许修改!只能改变指向地址的内存值!!

示例:

    char str[][20] = {"beijing", "tianjing", "shanghai", "chongqing"};
    //打印字符串
    for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++) 
        printf("%s ", str[i]);
    printf("\n");
    
    strcpy(str[0], "hebei"); //可以修改
    str[0][1] = 'E'; //可以修改
    //str[0] = "sichuan"; //不允许
    
    //打印字符串
    for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++) 
        printf("%s ", str[i]);
    printf("\n");
    return 0;
}

指针数组

指针数组是每个元素都是指针的数组

int a, b, c;

int* ptr_arr[] = {&a, &b, &c};

 

//指针数组演示
#include <stdio.h>
int main(void) {
    int a = 10;
    int b = 20;
    int c = 30;
    //定义初始化指针数组包含三个变量的地址
    int *parr[] = {&a, &b, &c}; 
    int size = sizeof(parr)/sizeof(parr[0]);
    //*parr[1] = *&b
    //**(parr+1) = *&b
    for(int i = 0; i < size; i++)
        printf("%d, %d\n", *parr[i], **(parr+i));
    
    for(int i = 0; i < size; i++){
        *parr[i] *= 10;
        **(parr+i) *= 10;
    }
    for(int i = 0; i < size; i++)
        printf("%d, %d\n", *parr[i], **(parr+i));
    return 0;
}

指针数组形式的字符串数组

        const char *sa[] ={"beijing","tianjing","shanghai',"chongqing"}; //实际是把字符串的地址放到指针中,注意这里的const!!!!!!!!!此处定义的是一个常量指针数组

        同时回忆定义指针表示字符串时

                const char *sa = "beijing";

        所以!!指针数组形式是一个常量指针,其指向地址的内存值不可修改,但是其指向的地址可以修改。

        这一点,区别于二维数组存储字符串时,a[][],前边的a[]是一维数组的地址,是不可更改的,但是内存值可以修改。指针数组是不可以修改指向地址的内存值,但是地址可以更改!!

 

//指针数组来表示字符串数组
#include <stdio.h>
int main(void) {
    //指针数组放的不是字符串放的是字符串的首地址
    char *arr[] = {"beijing", "tianjing", "shanghai", "chongqing"};
    //等价于:
    //char *arr0 = "beijing", *arr1 = "tianjing", *arr2 = "shanghai", *arr3 = "chongqing"
    //打印
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
        printf("%s ", arr[i]);
    printf("\n");

    //strcpy(arr[0], "hebei"); //不允许
    arr[0] = "hebei"; //可以,arr[0]元素来保存字符串hebei首地址
    
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
        printf("%s ", arr[i]);
    printf("\n");
    return 0;
}

C语言指针看container_of

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值