2017-06-11 95 views
-1

我刚刚开始学习c,并发现它很难包围我的头指针概念。C指针概念

我遇到了这个代码示例。

下面的表述是什么意思? Char * s_item [20];

我知道char * s_item意味着一个字符指针,并且您需要先为其分配内存,然后才能将字符串分配或复制到该字符中。它只是存储字符串的起始地址。

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

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

+1

'(char(*)20)'实际上并不意味着什么。你的意思是(char(*)[20])? – Ruslan

+0

@Ruslan是的,这就是我的意思。对于错字感到抱歉。 – redsoxlost

+1

@Olaf它是char(* s_item)[20];正如我所说,我已经读完了这本书。有时候只需要很少的帮助。没有“我们”,你不是stackoverflow。 – redsoxlost

回答

0
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是指向字符的指针。

+0

感谢您的回答。我编辑了这个问题以使其正确。 – redsoxlost

3

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

不同的地方定义它,每个元素要么是空指针(如果它是一个全局变量)或每个元素将是未初始化的并且具有不确定值(如果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 **)。有关这方面的解释,请参阅this old answer of mine

+2

+1,但有些挑剔:'也就是说。一串字符串'是不完全正确的。它只是一个“数组指针”。这些指针是否将用于字符串是另一回事。 – 4386427

+1

似乎OP已经在事后编辑了帖子。 char(* s_item)[20]'是指向20个字符数组的指针,而不是由20个字符指针组成的数组。 –