![](/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.