在处理指针指针时,为什么* to_init [0]和* to_init不一样?

时间:2014-09-03 21:31:43

标签: c pointers

void initialize_char(char** to_init, char* source, int start, int end)
{

    printf("%p\n",*to_init[0]);
    printf("%p\n",*to_init);
}

我注意到*to_init*to_init[0]是完全不同的内存地址。但据我了解(我需要纠正):

优先顺序意味着在*to_init[0]中,to_init[0]首先出现,然后是间接运算符。从技术上讲,不下标to_init[0],只是引用** to_init指向的指针,然后使用indirecrion操作符只是允许我访问这个指针内的内容吗? p>

因此,上述内容不应与*to_init相同吗?

4 个答案:

答案 0 :(得分:2)

to_init[0]被翻译为*(to_init + 0)*to_init。因此*to_init[0]等同于*(*to_init)或仅**to_init

to_initchar***to_initchar ***to_initchar

这意味着* to_init [0]为您提供char数组的实际char,* to_init为您提供指向char数组第一个位置的指针。这就是价值观不同的原因。

答案 1 :(得分:1)

to_init [0]与* to_init(指向to_init指向的char的指针)相同 所以* to_init [0]与** to_init(char)相同NOT * to_init(指向char的指针)。

答案 2 :(得分:1)

to_init的类型为char**,表示'指向char的指针'。

*to_init取消引用该变量,主要是获取char*类型的“指向char的指针”。

由于[]运算符的higher precedence取代*,因此第一个char*取消引用char。因此,第一个printf应该打印一个字符值,而不是指针。

As you can see here这是正确的 - 第一行返回十六进制0x61,这是a的ASCII值。第二行返回一个内存地址,即编译的字符串值的位置。

答案 3 :(得分:1)

他们说一张图片胜过千言万语。希望ASCII图像图片一样有用。

让你拥有:

int A = 10;
int* ip = &ip;
int** ipp = &ipp;

这些变量使用的内存类似于:

A
|
v
+----------------+
|    10          |
+----------------+

ip
|
v
+----------------+
| Address of A   |
+----------------+

ipp
|
v
+----------------+
| Address of ip  |
+----------------+

现在,让我们看一下与您正在使用的相似的展示次数:

*iip[0] = *(iip[0]) = *(ip) = 10
*iip = ip = Address of A

*iip[0]不是内存地址。这是A的价值。