![](/img/trans.png)
[英]How can char * name = “Duncan”; be valid if pointers can only hold addresses?
[英]Do pointers only hold addresses to other variables?
当涉及到指针时,我有点困惑。
一些示例代码:
char str1[80];
char *p1;
cout <<"Enter a string"<<endl;
cin >> str1;
p1 = str1;
在代码的最后一行,如果str1包含“ Test”,那么p1现在怎么包含“ Test”。 p1还是指针吗? 我认为指针仅包含指向其他变量的地址。
p1
不包含Test
。 它包含一个内存中的字节地址,该地址设置为字符T
的ASCII值,后跟e
, s
, t
和0。该地址是数组str1
的地址,即80个char
数组。
如果尝试打印str1
或p1
,则会得到输出Test
。 这是因为您无法将数组传递给函数,因此,如果尝试这样做,数组名称将衰减为指向第一个元素的指针,就像p1
一样。 因此str1
将衰减为指向T
的指针,而p1
已经为指向T
的指针,因此您在打印时将获得相同的输出,因为它们都指向内存中的相同地址。
p1
是一个指针。
这意味着p1
包含str1
第一个字符的内存地址。
当您去查看p1
“持有”的内容时,您可能执行了诸如cout << p1
或cout << p1[3]
。 这些中的任何一个都将取消引用 p1
,将其视为字符数组指针。
要查看p1
的实际值,请尝试cout << (void*)p1
。 这将与str1
的实际值相同-如果您输入“ Test”,则该存储位置包含'T'。
指针保留地址,仅此而已。 有时,您取消引用指针以获取数据,而有时将指针传递给将取消引用的代码。
例如 :
p1 = 0; //Point to invalid memory address, but an address nonetheless
p1 = str1 //Point to a valid buffer. p1 now holds an new address, nothing else
if(*p1 == 'A') //Dereference the pointer (gives a character)
printf("The first character in str1 is A.\n");
通过这样重组程序,可以强调p1除了指针之外不保存数据的事实:
char str1[80];
char *p1;
p1 = str1; //Point to un-initialized memory, your compiler might complain.
//but p1 is happy. It holds an address, it will never "hold" anything else.
//*p1 is valid (will not crash) but holds random garbage, do not use it!
cout <<"Enter a string"<<endl;
cin >> str1; //Now str1 was initialized
if(*p1 == 'A') //Dereference the pointer (it is now a character)
printf("The first character in str1 is A.\n");
现在要强调p1和str1是相同的东西(内存中的相同地址),将其添加到程序中:
str1[0] = 'A'; //Put a capital A in str1
if(*p1 == 'A') //Dereference the pointer (it is now a character)
printf("Now that we forced an A, this test is always true.\n");
是什么告诉您p1不是指针?
cout::<<
和printf
类的函数和运算符旨在打印字符串(以及其他数据类型),因此它们将为您适当地取消引用指针参数:为其提供指向字符串的指针,并将在该地址打印该字符串。 如果您确实希望它将指针的值打印为地址,则必须使用(void *)
。
请记住,对于数组:
int array[N];
array
的使用本质上是&array[0]
,因此,以下是相同的:
PrintAddress(&array[0]); // void PrintAddress(int*);
PrintAddress(array);
这样,当您执行以下操作时:
int *pAddress;
pAddress = &array[0];
PrintAddress(pAddress);
您可以将第二行修改为:
pAddress = array;
并且,仅出于完整性考虑,以下是相同的:
PrintAddress(&array[2]);
PrintAddress(array+2);
如下所示:
pAddress = array+5;
pAddress = &array[5];
printf("Address: %p\n", (void *)p1);
将打印地址(从如何在printf中查看结构的地址 )。
printf("String: %s\n", p1);
将打印字符串。
第一个是p1
的实际内容,第二个是该内容在程序上下文中的含义 : p1
是指向char
的指针,这是C语言中表示字符串的常用方式(以0- '\\0'
结尾)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.