[英]C pointer concept
我刚刚开始学习c,发现很难用指针概念来解决问题。
我遇到了此代码示例。
以下陈述是什么意思? 字符* s_item [20];
我知道char * s_item表示字符指针,您需要先为其分配内存,然后才能向其中分配或复制字符串。 它只是存储字符串的开始地址。
接下来,这句话是什么意思。 s_item =(char(*)20)calloc(30,20);
最后有人可以向我解释char ** values的概念,我知道这是一个指向指针的指针。 但是我们可以准确地存储什么样的价值。 它是字符串的集合吗?
如果您了解螺旋/顺时针规则 ,则可以将其解读为20个指向char
指针的数组。 即一个字符串数组。
根据定义的位置,每个元素将为空指针(如果它是全局变量),或者每个元素将未初始化并具有不确定的值(如果s_item
是局部变量)。 无论哪种方式,都必须使数组中的每个指针都指向一些有效数据,然后才能真正使用它们,方法是使它们指向现有字符串,或者通过动态分配内存然后进行初始化来进行使用。
至于指向指针的指针,则与任何其他指针相同:它是指向某物的指针,在这种情况下,它指向另一个指针。
例:
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" | +----+ +---+ +---------------+
也就是说, pp
指向变量p
, p
指向包含字符串"hello world"
内存。
上面显示的示例具有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
的值)。
指针的另一种用法是动态数组数组。 例如
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 **
) 并不相同。 有关此问题的解释,请参见例如我的旧答案 。
char *s_item[20];
上面的语句表示“ s_item”是一个数组,其元素是指向字符的指针。
s_item=(char(*)20)calloc (30,20);
您的代码似乎有问题。 首先, (char(*)20)
是强制转换,但我认为应该是(char*)
。 其次,这是无效的分配,因为您想将char *分配给char **。
“ calloc”是用于动态内存分配的C函数。 该函数返回(void *),表示指向未知的指针。 并将指针转换为char *的指针。 但它不能分配给s_item
因为s_item
是指向字符的指针。
至于第三个问题,如果变量pp
的类型为char **,我们可以在pp
存储一个地址,这意味着pp
是一个指针。 并且pp
存储的地址必须是另一个指向字符的指针的地址。 所以我们称pp
是指向字符的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.