承接上一篇 深入理解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);
一大堆定义不说了,就说个用途,如果我们想把字符串存入数组,那么:
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语言函数指针的知识。