簡體   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