深入理解C语言指针(三)

承接上一篇  深入理解C语言指针(二)之二级指针


1.char* 和 char []

  C语言中字符串有两种表现形式:

  第一种,用字符数组的形式 char str[5] = "abcde";

  第二种,用字符指针    char* str = "abcde";

  但上面两者还是有很大区别的,两者的变量名 str 都存在栈中,但第二种的 “abcde” 是常量字符串,存在常量区,不能更改,第一种每个字符都存在栈中,可以重新赋值,如下:

    char c1[4] = "abc";
    c1[0] = '6';
    c1[1] = '6';
    c1[2] = '6';
    
    printf("c1 = %s",c1);
数据结果为 c1 = 666 ,但是如果试图:

    char* c1 = "abc";
    c1[0] = '6';
    printf("c1 = %s",c1);
这样是会报错的,因为我们在试图改变常量字符串的值,是不能成功的,但是诸如这样的使用是可以的:

     char* c1;
     c1 = malloc(5);
     c1[0] = '6';
     c1[1] = '6';
     c1[2] = '6';
     printf("c1 = %s",c1);


2.二维数组

  一大堆定义不说了,就说个用途,如果我们想把字符串存入数组,那么:

    char c1[3][5] = {{"Jack"},{"Tom"},{"Lucy"}};
    printf("c1 = %s",c1[1]);
这样输出结果为 Tom。

3. char**

 这一看,二级指针,用它来干什么呢:

    char** ch;
    char* c1 = "abc";
    char* c2 = "666";
    ch = (char**)malloc(2*sizeof(char*));

    *ch = c1;
    *(ch+1) = c2;
    
    printf("ch.1 = %s \n",*ch);
    printf("ch.2 = %s \n",*(ch+1));
观察上面代码,我们发现它可以当存储字符串的数组,挺好,既然是数组,那我们用脚标写法:

    char** ch;
    char* c1 = "abc";
    char* c2 = "666";
    ch = (char**)malloc(2*sizeof(char*));

    ch[0] = c1;
    ch[1] = c2;
    
    printf("ch.1 = %s \n",ch[0]);
    printf("ch.2 = %s \n",ch[1]);
这样看着也比较工整一点。

回忆一下sqlite的回调函数:

static int callback(void *notUsed, int argc,char **argv,char **colName){
    
    printf("argc = %d \n",argc);
    printf("id = %s \n",argv[0]);
    printf("name = %s \n",argv[1]);
    printf("age = %s \n",argv[2]);
    
    return 0;
}
sqlite以 char** arg , char** colName 的数组形式将搜索到的数据返还给我们使用。

我觉得下一篇应该讨论一点有关C语言函数和C语言函数指针的知识。


下一篇   深入理解C语言指针(四)  之函数、函数指针



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值