2011-03-23 259 views
5

在將值分配給t之前,是否必須在以下代碼中初始化t?代碼是否正確?是否必須在C++中初始化指針?

void swap(int *x, int *y) 
{ 
    int *t; 
    *t = *x; 
    *x = *y; 
    *y = *t; 
} 
+0

你應該可能重新說一下你的問題。下面有一些看似矛盾的回覆,雖然都是正確的。 _賦值給未初始化的指針是完全合法的,_dereferencing_不是。你的代碼片段取消引用,但你的問題是關於賦值。 – Damon 2011-03-23 10:43:56

+0

方面的評論,有一個標準的定義'交換'功能(嗯,模板),但它有不同的語義,你在這裏做什麼。你確定你想通過改變語義來混淆用戶嗎? (在你的實現中:'swap(p,q)'等同於'std :: swap(* p,* q)'而不是'std :: swap(p,q)'後者會交換指針,比內容) – 2011-03-23 11:10:53

+0

我知道我們可以使用一個簡單的變量來存儲x指向的值,然後交換完成。但我只是在試驗,我們是否可以使用指針而不是簡單的變量來存儲值。 – Baali 2011-03-24 05:40:02

回答

9

你不需要指針開始:

void swap(int *x,int *y) 
{ 
    int t; //not a pointer! 
    t=*x; 
    *x=*y; 
    *y=t; 
} 
int a = 10, b = 20; 
swap(&a, &b); //<-----------note : Needed & 

-

或者,也許,你希望下面的交換功能:

void swap(int & x,int & y) //parameters are references now! 
{ 
    int t; //not a pointer! 
    t=x; 
    x=y; 
    y=t; 
} 
int a = 10, b = 20; 
swap(a,b); //<----------- Note: Not needed & anymore! 
+1

他的問題不是「如何交換兩個變量的值?」。 – 2011-03-23 10:41:32

+0

@Prasoon:我知道。但是我告訴他他有和可以嘗試的替代方案,因爲其他答案已經解釋了他的案例! – Nawaz 2011-03-23 10:42:54

8

是下面的一段代碼是否正確?

沒有!您的代碼會調用未定義的行爲,因爲您正試圖取消引用一個野指針。

int *t; 
*t=*x; // bad 

試試這個,而

int t; // a pointer is not needed here 
t=*x; 

或本

int *t = x; // initialize the pointer 

5

該代碼包含未定義行爲:

int *t; 
*t=*x; // where will the value be copied? 

除此之外它沒有任何意義 - 您需要一個臨時變量來存儲值,而不是指針。

int t; // not a pointer 
t=*x; 
*x=*y; 
*y=t; 
1

它是正確的一個指針。

只有聲明時需要初始化引用(或者在實例成員的構造函數中)。

編輯:但你有你的代碼中的錯誤,你不應該取消引用您的參數(即int *ptr = otherPtr;是罰款,不int *ptr = *otherPtr;

+0

取消引用未初始化的指針是未定義的行爲。 – 2011-03-23 10:37:12

+0

我只是回答OP的問題,而不是檢查整個代碼塊。問題是是否聲明沒有賦值的指針是有效的,它是。 – jv42 2011-03-23 10:38:49

+0

@ jv42:你不能聲明_with_賦值指針。 – 2011-05-03 21:59:04

0
int *t; 
*t=*x; 

t不指向任何有效位置,以便能夠解引用。

在將值賦給指針t之前,它是強制初始化的。

是的,初始化/分配指向一個有效的內存位置。否則它會指向哪裏。這可能有點指向垃圾並導致未定義的行爲取消引用

1

如果你只是想讓你的指針指向已經初始化的數據,那麼你不需要初始化它。儘管如此,你可以使用malloc函數之一爲整數分配足夠的堆空間。

正確的,有效的方式,做到用C交換/ C++是

void swap(int *x, int *y) { 
    int *t = x; 
    x = y; 
    y = t; 
} 
+0

我也是這麼做的。我試着永遠不要留下一個未初始化的指針,如果我已經有了另一個指向它的指針,那麼我只是初始化該值。 – Mephane 2011-03-23 13:20:23

1

你可以找到這樣here

#include <stdio.h> 

void swap(int *i, int *j) 
{ 
    int t; 
    t = *i; 
    *i = *j; 
    *j = t; 
} 

基本原因的正確方法已經給你解釋通過銳利但在那裏你會發現一些更多的細節和解釋當你做這樣的交換後臺會發生什麼。希望它有助於清除你的想法。