C 我需要帮助理解指针的语法

C 我需要帮助理解指针的语法,c,pointers,C,Pointers,我不熟悉指针,我对这部分代码感到困惑。我有几个问题: 在第一行中,我不确定双星号是什么意思。我读到它是另一个指针的指针,但我不知道它到底是什么 在第4行中,我不知道如何解释语法: *(*(total_number_of_pages + x) + y) 想象一下,如果你有一排书,你想知道每一排书有多少页。您可以使用存储在连续内存地址中的整数集合 现在假设你有很多行的书。您可以使用指向每行书籍的指针集合,每行书籍都是存储在连续内存地址中的整数集合 因为每行都是指针,所以行的地址是指向指针的指针。因

我不熟悉指针,我对这部分代码感到困惑。我有几个问题:

在第一行中,我不确定双星号是什么意思。我读到它是另一个指针的指针,但我不知道它到底是什么

在第4行中,我不知道如何解释语法:

*(*(total_number_of_pages + x) + y)

想象一下,如果你有一排书,你想知道每一排书有多少页。您可以使用存储在连续内存地址中的整数集合

现在假设你有很多行的书。您可以使用指向每行书籍的指针集合,每行书籍都是存储在连续内存地址中的整数集合

因为每行都是指针,所以行的地址是指向指针的指针。因此int**

现在,总页数是指向行的第一个指针。要获得第二个指针,您需要在其中添加一个指针。要到达第x行,您需要将x添加到其中。如果取消引用该指针,将得到指向第x行第一本书的指针。如果你想要第y本书,你可以加上y。现在,您在第x行中有一个指向第y本书的指针,您可以取消对该指针的引用以获得该书中的页数

如果你对指针不太熟悉,你真的不应该试着去理解这样的代码,直到你熟悉为止。

的确**总页数+x+y很难理解。这就是C语言提供另一种表示法的原因之一:*E1+E2也可以写成E1[E2]或E2[E1],因为+可以通勤。我们可以在表达式中应用此规则以获得:*总页数[x]+y,然后再次获得:总页数[x][y]

这更清楚。总页数是指向类似数组的内存区域底部的指针。_页面的总数[x]表示该页面的第x个元素的值。该元素本身是指向另一个数组的指针,其中[y]表示第y个值


在您的程序中,total_number_of_pages没有给定任何值,这意味着在表达式**total_number_of_pages+x+y中使用它会调用未定义的行为。要使表达式有效,它必须指向至少包含x+1个元素的指针数组,并且该数组的[x]元素必须指向至少包含y+1个元素的int数组

指针是包含内存地址的变量。要声明指针变量,只需在名称前使用星号声明一个正则变量

int *ptr;
我将尝试用一些图形和更少的代码向您解释指针

你是说给我内存地址3000中的值

但在这种情况下:

printf("%s\n", hello); //This will print "Hello World!"
printf("%s\n", point_to_hello); //This will print "Hello World!" again!
字符串是一个字符序列,您必须给出一个指向该序列开头的指针,以便printf打印字符串,直到找到特殊字符为止

在代码中

int** total_number_of_pages;
页面的总页数未初始化,这意味着我们无法确定输出是什么

printf("%d\n", *(*(total_number_of_pages + x) + y)); // (Line 4)

c中没有iostream
printf("%s\n", hello); //This will print "Hello World!"
printf("%s\n", point_to_hello); //This will print "Hello World!" again!
int** total_number_of_pages;
printf("%d\n", *(*(total_number_of_pages + x) + y)); // (Line 4)