繁体   English   中英

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

[英]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值,后跟est和0。该地址是数组str1的地址,即80个char数组。

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

p1是一个指针。

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

当您去查看p1 “持有”的内容时,您可能执行了诸如cout << p1cout << 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM