我想了解的是以下内容:
第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring 和 &mystring 和 mystring 有什么区别?
第二个问题 -
char* str = "Hello!";
MessageBox(NULL,str,str,NULL);
我们如何解释在这个函数中用作参数的 str :它是指针的地址还是字符串的地址?
我想了解的是以下内容:
第一个问题 - 假设我们声明了一个变量 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);
创建一个指向char
named的指针,该指针指向存储str
字符的内存(顺便说一下,它是只读的)'H'
。strlen(str)
将此字符的地址传递给strlen
函数,该函数开始计算后面的字母,'H'
直到它到达'\0'
(空终止字符)。
我相信你已经意识到已经有关于这个主题的书籍(或至少章节)。它可能会帮助您阅读其中任何一个,因为理解这将需要比您通常在一个问题中获得的更多解释。
让我们看看我是否可以通过向您展示程序中的内存外观来帮助您:
0xBB000000 0xBB000001 0xBB000002 0xBB000003
'H' 'e' 'l' 'l'
0xBB000004 0xBB000005 0xBB000006 0xBB000007
'o' '!' '\0' 240
0x74320000 0x74320001 0x74320002 0x74320003
0xBB 0x00 0x00 0x00
显然,事物可以在内存中的任何位置,但这显示了基本思想。您的字符串存储在某处,我将其放置在 0xBB000000,它将占用连续内存,并以 \0 终止。(地址 0xBB000007 只是为了完整性,还有一些其他的值可以是任何东西。)我已经将变量str
放在内存中的其他地方(因为字符串常量和堆栈变量通常放在不同的位置)。所以这个值占str
了4个字节,我从0x74320000开始。如果你把 4 个字节放在一起,你会得到 0xBB000000,这是你的实际字符串的地址。(注意,您的计算机实际上可能以不同的顺序表示此数字,但为简单起见,我假设为大端。)
char * str = "你好!" 告诉编译器创建一个指向字符的指针,然后调用它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,但parameter2 和parameter3 将各自保存0xBB000000 的值。
第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring 和 &mystring 和 mystring 有什么区别?
我假设 char *mystring = "Hello!";
*mystring
给你第一个cahr
字符串Hello!
,即H
.
&mystrimg
是指针的地址是指向mystring
mystring
字符串第一个元素的指针Hello!
我们如何解释在这个函数中用作参数的 str :它是指针的地址还是字符串的地址?
str
不是指针的地址,但在将给定字符串的第一个元素传递给函数时,它将衰减为指向给定字符串的第一个元素的指针MessageBox
。
*mystring 是字符指针的取消引用意味着它是字符串中的第一个字符
mystring 是第一个字符的地址
&mystring 是字符串的地址。