C指针的概念

时间:2017-06-11 08:42:07

标签: c pointers

我刚刚开始学习c并且发现很难绕过指针概念。

我遇到过这些代码示例。

以下声明是什么意思? Char * s_item [20];

我知道char * s_item表示一个字符指针,你需要先为它分配内存,然后才能将字符串赋值给它。它只存储字符串的起始地址。

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

最后,有人可以向我解释char **值的概念 我知道它是指向指针的指针。但是我们可以准确地存储什么样的价值观。它是字符串的集合吗?

2 个答案:

答案 0 :(得分:3)

如果您了解the spiral/clockwise rule,则可以将其解读为指向char的20个指针。即一串字符串。

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

对于指向指针的指针,它与任何其他指针一样:它是指向某个东西的指针,在这种情况下它指向另一个指针。

示例:

s_item

在内存中它看起来像这样

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

也就是说,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 指向变量ppp指向包含字符串p的内存。

上面显示的示例,"hello world"几乎没用,但是通过指针指针,您可以使用函数参数模拟通过引用传递,例如,执行以下操作:< / p>

pp

通过将指针传递给变量#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

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

指针指针的两种用法当然都适用于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 } 以外的其他数据类型。

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

答案 1 :(得分:0)

char *s_item[20];

上述语句表示“s_item”是一个数组,其元素是指向字符的指针。

s_item=(char(*)20)calloc (30,20);

您的代码似乎有问题。首先,(char(*)20)是强制投射,但我认为它应该是(char*)。其次,这是一个无效的赋值,因为你想将char *分配给char **。

“calloc”是用于动态内存分配的C函数。该函数返回一个(void *),表示指向unknown的指针。并且指针被转换为指向char *的指针。但它无法分配给s_item,因为s_item是指向字符指针的指针。

至于第三个问题,如果变量pp的类型是char **,我们可以在pp中存储一个地址,这意味着pp是一个指针。存储在pp中的地址必须是指向字符的另一个指针的地址。所以我们调用pp是指向字符指针的指针。