C语言中指针和解引用运算符的需求描述

C语言中指针和解引用运算符的需求描述,c,C,我想了解的是: 第一个问题-假设我们声明了一个变量char*mystring。*mystring和&mystring和mystring之间有什么区别 第二项问题- char* str = "Hello!"; MessageBox(NULL,str,str,NULL); 我们如何解释str在这个函数中用作参数:它是指针的地址还是字符串的地址 第一个问题-假设我们声明了一个变量char*mystring。*mystring和&mystring和mystring之间有什么区别 我想 char*mys

我想了解的是:

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

第二项问题-

char* str = "Hello!";
MessageBox(NULL,str,str,NULL);
我们如何解释str在这个函数中用作参数:它是指针的地址还是字符串的地址

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

我想 char*mystring=“你好!”

*mystring
首先给出字符串的
cahr
您好,即,
H

&mystring
是指针的地址
mystring

mystring
是指向字符串第一个元素的指针
Hello

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

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

后,它将衰减为指向该字符串第一个元素的指针:

int num;
int *pNum = #
  • pNum
    是指针的值,指针的地址是
    num
  • *pNum
    是取消引用的指针,直接引用
    num
    ,即
    *pNum=3
    3
    分配给
    num
  • &pNum
    可用于检索指针本身的地址
现在让我们假设函数接受类型为
const char*
的参数,假设:


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

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

mystring是第一个字符的地址


&mystring是字符串的地址。

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

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

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,这是实际字符串的地址。(注意,您的计算机实际上可能以不同的顺序表示此数字,但为了简单起见,我假设使用big-endian。)

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,但parameter2和parameter3将分别在其中保存值0xBB000000。

*str=dereferenced pointer:指向第一个字符&str==指针的地址。。。str==字符串的地址。。。是吗?@user2836131:是的,请注意
*str
的类型将是
char
0xBB000000  0xBB000001  0xBB000002  0xBB000003
   'H'          'e'         'l'         'l'

0xBB000004  0xBB000005  0xBB000006  0xBB000007
   'o'          '!'        '\0'         240

0x74320000  0x74320001  0x74320002  0x74320003
   0xBB        0x00        0x00        0x00