需要描述 C 中的指针和取消引用运算符



我想理解的是以下内容:

第一个问题 - 假设我们声明了一个变量 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 中,&parameter2 和 &parameter3 不会返回0x74320000,但参数 2 和参数 3 将分别保存其中0xBB000000的值。

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

mystring 是第一个字符的地址

&mystring 是字符串的地址。

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

我假设 字符 *我的字符串 = "你好!

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

我们如何插入此函数中用作参数的 str:它是指针的地址还是字符串的地址?

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

最新更新