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
相同吗?
答案 0 :(得分:2)
to_init[0]
被翻译为*(to_init + 0)
或*to_init
。因此*to_init[0]
等同于*(*to_init)
或仅**to_init
。
to_init
为char**
,*to_init
为char *
,**to_init
为char
。
这意味着* 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
的价值。