繁体   English   中英

C指针概念

[英]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指向变量pp指向包含字符串"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM