指针只保存其他变量的地址吗?

时间:2012-02-13 04:03:53

标签: c++ pointers

当谈到指针时,我有点困惑。

一些示例代码:

char str1[80];
char *p1;
cout <<"Enter a string"<<endl;
cin >> str1;

p1 = str1;

在最后一行代码中,如果str1包含'Test',那么p1现在如何包含'Test'。 p1还不是指针吗?我认为指针只包含其他变量的地址。

6 个答案:

答案 0 :(得分:4)

p1不包含Test。它包含内存中字节的地址,该字节设置为字符T的ASCII值,后跟est和0。 address是数组str1的地址,是一个80 char数组。

如果您尝试打印str1p1,则会获得输出Test。这是因为您无法将数组传递给函数,因此如果您尝试,数组名称将衰减为指向第一个元素的指针,就像p1一样。因此str1将衰减到指向T的指针,而p1已经是指向T的指针,因此在打印时会得到相同的输出,因为它们都指向内存中的地址相同。

答案 1 :(得分:1)

p1是指针。

这意味着p1包含 str1的第一个字符的内存地址。

当你去查看p1“持有”时,您可能会执行cout << p1cout << 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结尾)。