C语言中指针和解引用运算符的需求描述
我想了解的是: 第一个问题-假设我们声明了一个变量char*mystring。*mystring和&mystring和mystring之间有什么区别 第二项问题-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* 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