#include <stdio.h>
#define LENGTH 3
char *words[LENGTH];
int main( int argc, char *argv[] )
{
char *pc; // a pointer to a character
char **ppc; // a pointer to a pointer character
printf( "\n------------Multiple indirection example\n" );
// initialize our array string
words[0] = "zero";
words[1] = "one";
words[2] = "two";
// print each element
for ( int i = 0; i < LENGTH; ++i )
{
printf( "%s \n", words[i] );
}
ppc = words; // initialize the pointer to pointer to a character
for( int i = 0; i < LENGTH; ++i) // loop over each string
{
ppc = words + i;
pc = *ppc;
while (*pc != 0) { // process each character in a string
printf("%c ", *pc); // print out each character of the string individually
pc += 1;
}
printf("\n");
}
return 0;
}
写着“char**ppc“的部分声明了一个char双指针。ppc = word。一个被赋给单词的常规指针变量和这个双指针变量有什么区别?我也不明白为什么一个普通的指针变量会被赋值为一个双指针变量的值。有人能解释一下吗?
2条答案
按热度按时间igetnqfo1#
有两件事你需要学习:
1.所有数组自然 * 衰减 * 到指向其第一个元素的指针。例如,表达式
word
实际上与&word[0]
相同。由于word
是一个char *
元素的数组,因此指向这样一个元素的指针必须是char **
。1.对于任何指针(或数组)
p
和索引i
,表达式p[i]
与*(p + i)
完全相同。由此得出p[0]
与*(p + 0)
相同,*(p + 0)
与*p
相同。如果我们现在把这些放在一起我们开始
根据上述第1点,必须与
它使
ppc
指向数组words
的第一个元素。那我们有
这将等于
也就是说,它使
ppc
指向数组words
中的第i个元素。终于有了
也就是说
但由于
ppc
指向数组words
的第i个元素,因此最后一次赋值实际上与变量
ppc
在这个程序中并不是真正需要的,只是作为一个例子。为了说明它,让我们“画”出来...
我们有
words
数组:在循环的第一次迭代中,当
i == 0
时,则我们有这导致了
然后我们有第二次迭代,当
i == 1
,然后给予看起来
对于循环的第三次也是最后一次迭代,也是完全相同的。
bgtovc5b2#
如果你想要一个
char*
(单词数组)的数组,你需要一个char** pointer
例如:
char** wordsArr = {"hello","word"}
是char*
的数组,您可以将每个单元格视为字符串。它与
char* words = "hello world"
不同,因为如果我们只想打印第一个单词,printf("%s",words)
将打印"hello world"
,而printf("%s",wordsArr[0])
将打印"hello"