满意答案
char **p={"abc","defg","hijkl"}; 这个声明和初始化编译不能通过。
声明成:char *p[]={"abc","defg","hijkl"}; 相当于 声明 char *p[3];
你想用 **, 另声明 char **x; 把p的始地址传给它。
========
main()
{
char *p[]={"abc","defg","hijkl"};
char **x= &p[0];
printf("%s\n%s\n%s\n", *(p),*(p+1),*(p+2)); // 用 p 的方法
printf("%s\n%s\n%s\n", *x,*(x+1),*(x+2)); // 用 x 的方法
printf("%c\n",*(*(x+1)+2)); // 打印 1个字符
return 0;
}
===
C 语言 语句 里,[] 是运算符。有 “数组与指针关系" 恒等式: a[i] = * ( a + i)
套用 上面恒等式, 找出 语句里 2维数组与指针关系:
a[j][i] = (a[j]) [i] = * ( a[j] + i) = * ( *(a+j) + i )
把声明 char **x; 在语句里的x, 看成 2 维数组,就有
x[j][i] = *(*(x+j) +i);
j 是 行,i 是 列。追问: 先谢谢,我写的那条语句在ubuntu里编译是警告,printf("%s",p);打印出的是abc,但是后面的字符串不知道怎么打印出来。char *p[]={"abc","defg","hijkl"};这个定义可以打印出来,为什么char **p={"abc","defg","hijkl"};这个不可以呢?还是平时不这样书写。
追答:char *p[]={"abc","defg","hijkl"};
这个初始化里含3个字符串,编译器能数出来,编译器于是把上面声明理解为:
char *p[3]={"abc","defg","hijkl"};
也就是3个指针,分别指向3个字符串。
char **p={"abc","defg","hijkl"}; 这里**p 是2重指针(指针的指针),编译器无法处理。
printf("%s",p);打印出的是abc ,那是你的编译器把它指向 0 点。歪打歪着。
00分享举报