我刚刚开始学习c并且发现很难绕过指针概念。
我遇到过这些代码示例。
以下声明是什么意思? Char * s_item [20];
我知道char * s_item表示一个字符指针,你需要先为它分配内存,然后才能将字符串赋值给它。它只存储字符串的起始地址。
接下来,这句话意味着什么。 s_item =(char(*)20)calloc(30,20);
最后,有人可以向我解释char **值的概念 我知道它是指向指针的指针。但是我们可以准确地存储什么样的价值观。它是字符串的集合吗?
答案 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
指向变量pp
,p
指向包含字符串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
是指向字符指针的指针。