当谈到指针时,我有点困惑。
一些示例代码:
char str1[80];
char *p1;
cout <<"Enter a string"<<endl;
cin >> str1;
p1 = str1;
在最后一行代码中,如果str1包含'Test',那么p1现在如何包含'Test'。 p1还不是指针吗?我认为指针只包含其他变量的地址。
答案 0 :(得分:4)
p1
不包含Test
。它包含内存中字节的地址,该字节设置为字符T
的ASCII值,后跟e
,s
,t
和0。 address是数组str1
的地址,是一个80 char
数组。
如果您尝试打印str1
或p1
,则会获得输出Test
。这是因为您无法将数组传递给函数,因此如果您尝试,数组名称将衰减为指向第一个元素的指针,就像p1
一样。因此str1
将衰减到指向T
的指针,而p1
已经是指向T
的指针,因此在打印时会得到相同的输出,因为它们都指向内存中的地址相同。
答案 1 :(得分:1)
p1
是指针。
这意味着p1
包含 str1
的第一个字符的内存地址。
当你去查看p1
“持有”时,您可能会执行cout << p1
或cout << p1[3]
之类的操作。其中任何一个都将取消引用 p1
,将其视为指向字符数组的指针。
要查看p1
的实际值,请尝试cout << (void*)p1
。如果输入“Test”,这将与str1
的实际值相同 - 包含'T'的内存位置。
答案 2 :(得分:1)
指针只有地址,仅此而已。有时您取消引用指针来获取数据,有时您将指针传递给将取消引用它的代码。
例如:
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");
答案 3 :(得分:1)
什么告诉你p1不是指针?
cout::<<
和printf
之类的函数和运算符用于打印字符串(以及其他数据类型),因此它们将适当地取消引用指针参数:给它一个指向字符串的指针将在该地址打印字符串。如果您确实希望它将指针的值打印为地址,则必须使用(void *)
进行转换。
答案 4 :(得分:1)
请记住,对于数组:
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];
答案 5 :(得分:0)
printf("Address: %p\n", (void *)p1);
将打印地址(来自how to see address of a structure in printf)。
printf("String: %s\n", p1);
将打印字符串。
第一个是p1
的实际内容,第二个是您的程序上下文中意味着的内容:p1
是指向{{1}的指针},这是C中表示字符串的通常方式(以0 - char
结尾)。