用指针操作二维数组

问题描述 投票:0回答:1

我正在尝试使用指针来操作一些二维数组,我知道指针的基础知识,但是我在使用这段代码时遇到了困难:

{
    

    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)
一样?提前致谢

c pointers multidimensional-array char implicit-conversion
1个回答
0
投票

编译器应该为指针的声明发出消息

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)+1
you 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'
.

© www.soinside.com 2019 - 2024. All rights reserved.