user-0 提问: 关于一级指针和二级指针的转换

回复:
user: user-1
content: 引用 10 楼 weixin_45788663 的回复:[quote=引用 8 楼 SuperDay的回复:]我觉得没有意义啊，只要掌握了指向数组的指针和指针数组就够了。你这样写指向数组的指针的指针（也就是你所谓的二级指针），有什么特别功能吗？我是实用主义者，只要能实现功能，办法尽量简单易懂，就很满足了，像这样拗口的指针概念会把人绕晕。现实中还是指针数组更为常用一点，并且大多数情况下都是跟结构体结合使用的 刚上大一 学习到这方面知识 为了后面考试得搞明白其他指针方面基本能理解也能用 就这个二级指针 我挺不知道怎么用这个二级多级[/quote]  当你函数调用需要二级指针的时候就会有需要了。

user: user-2
content: p1是指针的数组，数组中的每个元素都指向长度为20字节的内容，所以p1+1实际上是位移了20个字节； p2是指针的指针，每个指针的大小是4个字节，所以p2+1实际上位移了4个字节。  请参考 《指向指针的指针》 《C++中指针的数组和数组的指针》 《C++数组地址偏移》 希望能够帮到你！ 另外，为毛我的VC++6.0 p2 = &p1;报错，必须写成 p2 = (char**)&p1;呢？

user: user-3
content: 类型不匹配，编译器应该给你提示warning了吧。  #include <stdio.h>   int main(void) {     char s[5][20], *p, (*p1)[20], **p2;     int i;      for (i = 0; i < 5; i++)         gets(s[i]);     p1 = s;     for (i = 0; i < 5; i++)         puts(*(p1+i));     putchar('\n');      p = s[0];     p2 = &p;      for (i = 0; i < 5; i++)         puts(*p2 + i * 20);     return 0; } 供参考～

user: user-4
content: 9楼的程序有没看懂呢？

user: user-0
content: 引用 8 楼 SuperDay的回复:我觉得没有意义啊，只要掌握了指向数组的指针和指针数组就够了。你这样写指向数组的指针的指针（也就是你所谓的二级指针），有什么特别功能吗？我是实用主义者，只要能实现功能，办法尽量简单易懂，就很满足了，像这样拗口的指针概念会把人绕晕。现实中还是指针数组更为常用一点，并且大多数情况下都是跟结构体结合使用的 刚上大一 学习到这方面知识 为了后面考试得搞明白其他指针方面基本能理解也能用 就这个二级指针 我挺不知道怎么用这个二级多级

user: user-5
content: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { 	char s[5][20], (*p1)[20], **p2; 	int i; 	for ( i=0; i<5; i++) gets(s[i]); 	p1 = s; 	// p1是一个指针，指针的类型是char[20] 	// p2 是指针的指针， 对应了变量的p1的地址，*p2才和p1是等值  	p2 = &p1; 	printf(" s=%p\n", s); 	printf("p1=%p\n", p1);  	printf("p2=%p\n", p2);  	for ( i=0; i<5; i++) { 		printf("p1[%d] %p:%s\n", i, &p1[i], p1[i]); 	};  	for ( i=0; i<5; i++) { 		printf ("p2[%d] %p:%s\n", i*20, *p2+i*20, *p2+i*20 ); 	};  	return 0; }

user: user-4
content: 我觉得没有意义啊，只要掌握了指向数组的指针和指针数组就够了。你这样写指向数组的指针的指针（也就是你所谓的二级指针），有什么特别功能吗？我是实用主义者，只要能实现功能，办法尽量简单易懂，就很满足了，像这样拗口的指针概念会把人绕晕。现实中还是指针数组更为常用一点，并且大多数情况下都是跟结构体结合使用的

user: user-0
content: 引用 5 楼 SuperDay的回复:p1是一个数组，&p1和p1取值相同的 那这道程序我要怎么改呢

user: user-0
content: 那这道程序我要怎么改呢

user: user-4
content: p1是一个数组，&p1和p1取值相同的

user: user-0
content: 引用 2 楼 user-6的回复:p2这程序里啥用？ p2是&p1 那*p2不就是p1的值吗 就是s的首地址

user: user-0
content: 引用 1 楼 SuperDay的回复:楼主知道p2这样的指针代表什么含义吗？ 不是p1的地址吗吗！

user: user-6
content: p2这程序里啥用？

user: user-4
content: 楼主知道p2这样的指针代表什么含义吗？

user: user-5
content: p2 是char**  一个char是一个字节， 用20是为了找到s当中的下一个字符串， char  s【5】【20】   20是这么来的 p1 是明确知道指向的是一个长度20的数组的，所以p1可以直接加

user: user-0
content: 引用 20 楼 SuperDay的回复:字符就一个字节，怎么会2*20？ p2的基类型是什么呢

user: user-0
content: 引用 20 楼 SuperDay的回复:字符就一个字节，怎么会2*20？ 对，是一个 写错了。那请问我那样的理解对吗

user: user-4
content: 字符就一个字节，怎么会2*20？

user: user-0
content: 引用 16 楼 SuperDay的回复:[quote=引用 14 楼 weixin_45788663的回复:][quote=引用 11 楼 SuperDay的回复:]9楼的程序有没看懂呢？ 有点懂 但是不太明白为什么是+i*20，不能直接+i吗 。就如同*（a+i）一样 a是一个数组的首地址也就是第0行，+i直接跳到下一行地址去了。[/quote] 因为p1是数组指针，跟数组长度有关，但是p2无法得到数组信息，只能硬加20，但是这样写就没有意义了，还不如用指针数组[/quote] 所以p2指向的数据类型是指针 p1指向的数据类型是2*20个字节的字符数组 所以不一样对吗 但为啥p2只加20不是应该40吗（我有点蠢，绕不太过来。。）

user: user-0
content: 引用 16 楼 SuperDay的回复:[quote=引用 14 楼 weixin_45788663的回复:][quote=引用 11 楼 SuperDay的回复:]9楼的程序有没看懂呢？ 有点懂 但是不太明白为什么是+i*20，不能直接+i吗 。就如同*（a+i）一样 a是一个数组的首地址也就是第0行，+i直接跳到下一行地址去了。[/quote] 因为p1是数组指针，跟数组长度有关，但是p2无法得到数组信息，只能硬加20，但是这样写就没有意义了，还不如用指针数组[/quote] 所以p2指向的数据类型是指针 p1指向的数据类型是2*20个字节的字符数组 所以不一样对吗 但为啥p2只加20不是应该40吗（我有点蠢，绕不太过来。。）