在C语言中,一个指针可以指向多个指针吗?
我们可以通过写入int*来声明指向整数的指针。我们已经看到一个指针类型char**argv。这是指向字符指针的指针 似乎argv是指向指向字符的多个指针的指针 在C语言中,字符串由指针类型char*表示。在引擎盖下,它们存储为字符列表,其中最后一个字符是称为空终止符的特殊字符 上述字符**中指针是否以字符形式存储在字符串中?是在C语言中,一个指针可以指向多个指针吗?,c,pointers,debugging,unix,C,Pointers,Debugging,Unix,我们可以通过写入int*来声明指向整数的指针。我们已经看到一个指针类型char**argv。这是指向字符指针的指针 似乎argv是指向指向字符的多个指针的指针 在C语言中,字符串由指针类型char*表示。在引擎盖下,它们存储为字符列表,其中最后一个字符是称为空终止符的特殊字符 上述字符**中指针是否以字符形式存储在字符串中?是 指向类型T的指针p可以指向单个T,也可以指向T的数组。在后一种情况下,您可以使用指针算法(如p[n])索引到数组中。同样地,argv[n]的指针对象不是单个的chars,
指向类型
T
的指针p
可以指向单个T
,也可以指向T
的数组。在后一种情况下,您可以使用指针算法(如p[n]
)索引到数组中。同样地,argv[n]
的指针对象不是单个的char
s,而是以nul结尾的char
s数组,也称为C样式字符串。指针可以指向单个对象,也可以指向对象数组
对于声明为char*argv[]
(或等效为char**
,因为它是一个函数参数)的argv
参数到main
,它是指向char*
数组的指针
在内存中,它看起来像这样:
argv
-----
| .-|----> ------
----- | | ----------------------------------
| .-|-----> | s | t | r | i | n | g | 1 | \0 |
| | ----------------------------------
------
| | ----------------------------------
| .-|-----> | s | t | r | i | n | g | 2 | \0 |
| | ----------------------------------
------
| | ----------------------------------
| .-|-----> | s | t | r | i | n | g | 3 | \0 |
| | ----------------------------------
------
...
指针是对内存地址的引用-指针包含一个变量的地址。指向指针的指针是一种间接寻址形式,其中指针包含指向另一个指针变量的地址。第二个指针变量包含存储值的地址
argv是指参数向量,它引用通过命令行传递给程序的参数。指针argv指向字符数组中的第一个元素;现在,由于向量表示为数组,它隐式地查找其他指针。当我们定义一个
char*argv[]
时,例如:
示例1:
char *p[5] = {{"ali"}, {"reza"}, {"hamid"}, {"saeed"}, {"mohsen"}};
for(int i = 0;i < 5;i++)
printf("%s\n", *p[i]);
这在内存中发生:
内存地址:| 0xA0 | 0xA1 | 0xA2 | 0xA3 | 0xA4 | 0xA5 | 0xA6 | 0xA7|
内存内容:| 0x123 | 0x456|
|-------4字节------|
|你到底在问什么还不完全清楚。完全不清楚。问题是什么?这个问题对我来说很清楚。不知道还有什么好说的。你熟悉数组吗?因为你应该从数组而不是字符串的角度来考虑,因为字符串并不是C语言中真正存在的东西,而是一个char
数组,一些函数用一种特殊的方式处理它,使之像字符串一样。因此,不是你持有一个指针字符串,而是一个指针数组,就像字符串实际上是一个字符数组,但对空终止符有特殊意义。
char **p;
p = new char*[5];
for(int i = 0;i < 5;i++)
p[i] = new char[10];
Memory-Address: |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content: | 0x123 | 0x456 |
|-------4-Byte------|
|<- int* = 0x123
Memory-Address: |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content: | 0xA4 | 0x123 |
|-------4-Byte------|
|<- int** = 0xA4 |<- int* = 0x123