我想理解的是以下内容:
第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring和&mystring和mystring有什么区别?
第二个问题 -
char* str = "Hello!";
MessageBox(NULL,str,str,NULL);
我们如何插入此函数中用作参数的 str:它是指针的地址还是字符串的地址?
在这些行之后:
int num;
int *pNum = #
-
pNum
是指针的值,它是num
的地址 -
*pNum
是取消引用的指针,直接引用num
,即*pNum = 3;
将3
分配给num
-
&pNum
可用于检索指针本身的地址
现在假设你有函数接受类型const char*
的参数,假设strlen
:
char* str = "Hello!";
int len = strlen(str);
创建一个指向名为 str
char
的指针,该指针指向存储字符'H'
的内存(顺便说一下,它是只读的(。 strlen(str)
将此字符的地址传递给strlen
函数,该函数开始计算'H'
之后的字母,直到到达' '
(以 null 结尾的字符(。
你已经意识到关于这个主题的书籍(或至少是章节(。 阅读其中任何一个可能会有所帮助,因为理解这将需要比您通常在一个问题中得到的更多的解释。
让我们看看我是否可以通过向您展示程序内的内存来帮助您:
0xBB000000 0xBB000001 0xBB000002 0xBB000003
'H' 'e' 'l' 'l'
0xBB000004 0xBB000005 0xBB000006 0xBB000007
'o' '!' ' ' 240
0x74320000 0x74320001 0x74320002 0x74320003
0xBB 0x00 0x00 0x00
显然,事物可以在内存中的任何位置,但这显示了基本思想。 你的字符串存储在某个地方,我把它放在0xBB000000,它会占用连续的内存,并以 \0 结尾。 (地址0xBB000007只是为了完整性,并且具有其他一些可能是任何东西的价值。 我将变量str
内存中的其他地方放置(因为字符串常量和堆栈变量通常放置在不同的位置(。 所以str
的值占用了 4 个字节,我从 0x74320000 年开始。 如果将那里的 4 个字节放在一起,您将得到0xBB000000,这是实际字符串的地址。 (请注意,您的计算机实际上可能以不同的顺序表示此数字,但为了简单起见,我假设使用大端序。
char * str = "Hello!!" 告诉编译器创建一个指向字符的指针,并调用该str
,并让它指向字符串 "Hello!"。 所以,str 是一个变量,它存储一个指针。
如果在此示例中打印出 str 的值,在这种情况下它将返回 (char *)0xBB000000
。
如果你看一下 *str,这意味着它(char *)0xBB000000
取值并取消引用它。 也就是说,它返回存储在该指针中的任何字符。 在本例中,即"H"。
如果你看一下 &str,这实际上是变量的地址。 在这种情况下,这将返回(void *) 0x74320000
。
只是为了让它更混乱,如果你看str[0]
,这与*str
相同(而str[1]
与*(str + 1)
相同,并将返回"e"(。 如果你看&str[2]
,那就是取str[2]
的地址,这是持有第一个字母"l"的地址,0xBB000002。
在您在第 2 部分中提出的两个选项中,"字符串地址"是更好的答案,尽管您真正要做的是将 char * 传递给字符串。 在函数内部,该参数实际上是值的副本,而不是原始值。 即,在 MessageBox 中,¶meter2 和 ¶meter3 不会返回0x74320000,但参数 2 和参数 3 将分别保存其中0xBB000000的值。
*mystring是字符指针的取消引用,这意味着它是字符串中的第一个字符
mystring 是第一个字符的地址
&mystring 是字符串的地址。
第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring和&mystring和mystring有什么区别?
我假设 字符 *我的字符串 = "你好!
*mystring
给你字符串Hello!
的第一个cahr
,即H
。
&mystrimg
是指针mystring
的地址 mystring
是指向字符串的第一个元素的指针Hello!
我们如何插入此函数中用作参数的 str:它是指针的地址还是字符串的地址?
str
不是指针的地址,但它在将给定字符串的第一个元素传递给函数 MessageBox
时会衰减到指向给定字符串的第一个元素的指针。