我正在尝试使用指针来操作一些二维数组,我知道指针的基础知识,但是我在使用这段代码时遇到了困难:
{
char a[3][10] = { "Malek", "Zied","Nicolas" };
char* ptr = a;
char c = *(*(a + 1) + 1);
char r = *(ptr + 1)+1;
printf("i from Zied is %c :\n", c);
printf("i from zied is also : %c", c);
return 0;
}
现在 ptr 包含 a 的地址,所以我不明白为什么
*(ptr + 1)+1
返回一个字符而不是地址。在这种情况下,a
和 ptr
不应该相似吗?如何:* (* (a + 1) + 1)
和(* (ptr + 1)+1)
不一样,* (ptr + 1)+1
和* ( *(a + 1) + 1)
一样?提前致谢
编译器应该为指针的声明发出消息
ptr
char a[3][10] = { "Malek", "Zied","Nicolas" };
char* ptr = a;
因为指针
ptr
的类型和初始化表达式的指针类型不兼容,指针类型之间没有隐式转换。用作初始值设定项的数组 a
被隐式转换为指向其类型为 char ( * )[10]
的第一个元素的指针,而初始化指针 ptr
的类型为 char *
.
你应该写
char a[3][10] = { "Malek", "Zied","Nicolas" };
char* ptr = ( char * )a;
在此初始化中,二维数组被解释为一维数组,指针
ptr
现在指向二维数组第一“行”的字符'M'
a
.
因此表达式
ptr + 1
指向字符串“Malek”中的字符'a'
的第二个字符。取消引用指针表达式 *( ptr + 1 )
你得到指向字符 'a'
并将 1 加到字符 'a' *(ptr + 1)+1you get the character
'b'.
至于这个表达式
*(*(a + 1) + 1)
那么正如已经提到的那样,a
被隐式转换为指向其类型为 char ( * )[10] 的第一个元素(“行”)的指针。表达式a + 1
指向数组的第二个“行”,即数组的第二个元素。表达式 *( a + 1 )
产生 char[10] 类型的一维数组的左值,即数组 a
的第二“行”。在这个表达式 *(a + 1) + 1
中,表达式 *( a + 1 )
又隐式转换为指向其类型为 char *
的第一个元素的指针。即类型 char[10]
的表达式被转换为指向第二个“行”的第一个字符的表达式 char *
。所以 while 表达式指向第二个“行”的第二个字符,即字符'i'
取消引用指针表达式你得到这个字符'i'
.