我想了解的是以下内容:
第一个问题 - 假设我们声明了一个变量 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);
创建一个指向charnamed的指针,该指针指向存储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 是字符串的地址。