gpt4 book ai didi

C 指针概念

转载 作者:行者123 更新时间:2023-11-30 18:35:51 26 4
gpt4 key购买 nike

我刚刚开始学习 C,发现很难理解指针概念。

我遇到过这个代码示例。

下面这句话是什么意思?字符 *s_item[20];

我知道 char *s_item 表示字符指针,您需要先为其分配内存,然后才能将字符串分配或复制到其中。它只存储字符串的起始地址。

接下来,这句话是什么意思。s_item=(char(*)20)calloc(30,20);

最后有人可以向我解释一下 char **values 的概念吗我知道它是一个指向指针的指针。但我们到底可以在其中存储什么样的值呢?它是字符串的集合吗?

最佳答案

如果您了解 the spiral/clockwise rule,您可以将其解读为包含 20 个指向 char 的指针的数组。 IE。字符串数组。

根据定义的位置,每个元素要么是空指针(如果它是全局变量),要么每个元素都未初始化并具有不确定值(如果s_item code> 是局部变量)。无论哪种方式,您都必须使数组中的每个指针指向一些有效数据,然后才能真正使用它们,方法是使它们指向现有字符串或动态分配内存然后初始化。



<小时/>

对于指向指针的指针,它与任何其他指针相同:它是一个指向某物的指针,在本例中它指向另一个指针。



示例:



char *p = malloc(12);  // Allocate 12 bytes and make the variable p point to it
strcpy(p, "hello world"); // Initialize the memory we just allocated with a string

char **pp = &p; // Make the variable pp a pointer, and make it point to the variable p

在内存中它看起来像这样

+----+     +---+     +---------------+| pp | --> | p | --> | "hello world" |+----+     +---+     +---------------+

That is, pp is pointing to the variable p, and p is pointing to memory containing the string "hello world".

The example shown above, having pp is pretty much useless, but with pointers to pointers you can emulate pass by reference with function arguments, and for example do something like this:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void function(char **pp)
{
*pp = malloc(12); // Allocate memory
strcpy(*pp, "hello world");
}

int main(void)
{
char *p; // Define variable, but don't initialize it

function(&p); // Pass a pointer to the variable p

printf("p = \"%s\"\n", p); // Will print p = "hello world"
}

通过将变量p的指针(使用&p)传递给函数,函数可以修改指针(即p的值)).

指针到指针的另一个用途是动态数组数组。例如

char **pp = malloc(5 * sizeof(char *));  // Allocate space for five pointers to char
for (size_t i = 0; i < 5; ++i)
{
pp[i] = malloc(12); // Allocate space for a string
strcpy(pp[i], "hello world"); // Initialize the memory
}

现在我们有一个动态分配的数组,由五个动态分配的 12 个字符的数组组成。

指向指针的指针的两种用法当然都适用于 char 之外的其他数据类型。

应该注意的是,即使数组自然地衰减为指向其第一个元素的指针,但数组的数组(例如 char x[20][20])不是 与指向指针的指针相同(例如 char **)。有关对此的解释,请参见例如this old answer of mine

关于C 指针概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44481932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com