0

我想了解的是以下内容:

第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring 和 &mystring 和 mystring 有什么区别?

第二个问题 -

char* str = "Hello!";
MessageBox(NULL,str,str,NULL);

我们如何解释在这个函数中用作参数的 str :它是指针的地址还是字符串的地址?

4

4 回答 4

1

在这些行之后:

int num;
int *pNum = #
  • pNum是指针的值,它是一个地址num
  • *pNum是解引用的指针,num直接引用,即*pNum = 3;赋值3num
  • &pNum可用于检索指针本身的地址

现在让我们说你有函数接受类型的参数const char*,让我们说strlen

char* str = "Hello!";
int len = strlen(str);

创建一个指向charnamed的指针,该指针指向存储str字符的内存(顺便说一下,它是只读的)'H'strlen(str)将此字符的地址传递给strlen函数,该函数开始计算后面的字母,'H'直到它到达'\0'(空终止字符)。

于 2013-10-04T21:50:32.673 回答
1

我相信你已经意识到已经有关于这个主题的书籍(或至少章节)。它可能会帮助您阅读其中任何一个,因为理解这将需要比您通常在一个问题中获得的更多解释。

让我们看看我是否可以通过向您展示程序中的内存外观来帮助您:

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 的值。

于 2013-10-04T22:09:14.943 回答
0

第一个问题 - 假设我们声明了一个变量 char *mystring 。*mystring 和 &mystring 和 mystring 有什么区别?

我假设 char *mystring = "Hello!";

*mystring给你第一个cahr字符串Hello!,即H.
&mystrimg是指针的地址是指向mystring
mystring字符串第一个元素的指针Hello!

我们如何解释在这个函数中用作参数的 str :它是指针的地址还是字符串的地址?

str不是指针的地址,但在将给定字符串的第一个元素传递给函数时,它将衰减为指向给定字符串的第一个元素的指针MessageBox

于 2013-10-04T21:50:01.243 回答
0

*mystring 是字符指针的取消引用意味着它是字符串中的第一个字符

mystring 是第一个字符的地址

&mystring 是字符串的地址。

于 2013-10-04T21:51:55.477 回答