2016-11-06 342 views
-1
#include <iostream> 
using namespace std; 

void fn(int* input_ptr) { 
    int *ptr2 = input_ptr; 
    cout << "pointer 2 is " << *ptr2 << endl; 
} 

int main() { 
    int *ptr1; 
    *ptr1 = 7; 
    fn(ptr1); 
} 

該實施例的工作原理,正如我將指針傳遞給函數,並分配給該函數內的暫時指針,結果表明指針2也是7. 然而,C++指定指向指針

#include <iostream> 
using namespace std; 

int main() { 
    int *ptr1; 
    *ptr1 = 7; 
    int *ptr2; 
    *ptr2 = ptr1; // or I have also tried *ptr2 = *ptr1 
    cout << "pointer 2 is " << *ptr2 << endl; 
} 

相同的步驟在主函數中不起作用。我知道你可以使用不帶星號的地址ptr2 = ptr1,它可以工作。

但是,在第一個示例中,我可以直接將指針作爲函數參數指定給帶有星號(或稱爲取消引用?)的新指針,但在第二個示例中,我無法在主函數中執行此操作。

任何人都可以幫助解決這個問題嗎?欣賞你的時間。

+4

'這個例子有效,' - 你真幸運。 'ptr1'沒有指定內存地址。您需要使用'new'分配內存 –

回答

3

main中,變量ptr1未初始化爲指向正確分配的內存塊。

因此,您的程序的其餘部分產生未定義的行爲。

+0

感謝您的幫助和時間。現在我懂了。我知道這肯定是一個非常愚蠢的問題。 – 0xFF

+0

@ 0xFF:不客氣,不用擔心這個問題,這不是愚蠢的。 –

6

在這兩個示例中,您取消引用未初始化的指針,即未定義的行爲

對於指針賦值問題,您可以直接分配:

int *ptr2 = ptr2; 

在你的第二個例子,只要你在一個有效的位置,請確保ptr1點。例如,

int x; 
int *ptr1 = &x; /* ptr1 now points to the address of x */ 
*ptr1 = 7; 
int *ptr2; 
ptr1 = ptr2; 
+0

感謝您的時間和幫助。我還有一個問題,'int * ptr1 =&x;'等於'int * ptr1; ptr1 =&x;'對嗎? – 0xFF

+0

是的。這是正確的。 – usr

+0

非常感謝,現在我明白了。 – 0xFF

1

在這裏如何使用指針存在一個主要問題。直接解引用指針可能會導致不確定的行爲由USR的建議和巴拉克

您需要爲這裏的指針使用

int* ptr1 = new int[1]; 

此外,由於你是一個分配的內存來分配內存,你需要清理與

delete[] ptr1; 

退出如果之前你不想使用動態內存分配的工作,你可以將其初始化爲

int a = 7; 
int* ptr1 = &a; 

這樣你就不會取消引用流浪的指針並導致未定義的行爲。

關於與C值的

*ptr1 = ptr2; // or I have also tried *ptr1 = *ptr2 

分配++或C你的輸出是由右至左。因此,ptr2將不具有ptr1的值;

例如;

int a = 5; 
int b = 6; 

a=b; 

會使a = 6

相反

b = a; 

將使b = 5

+0

而不是'int * ptr1 = new int [1];'您可以使用'new int' –

+0

感謝您的時間和幫助。現在我懂了。 – 0xFF