1樓:偷心的賊
首先,第一行肯定是輸出亂碼,解釋2個知識點你就知道了:
1.陣列和指標的區別,其實對於你的問題這不是最重要的,不過既然你問道區別就說說吧:
陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值(指標的值指的是指標所指的地址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列char a;那麼如果出現a = a+1;這是編譯都通不過的錯誤。而對於一個普通的指標是可以的,再比如有陣列char a;那麼再定義一個char *p = a;然後再用p = p+1是合法的,這表示讓指標p指向&a[1]。
它們的第二個區別是:每當用到陣列名這個指標的時候,系統都會傳入陣列的資訊,而普通的指標只是一個4位元組的整數,例如:
char a[5];
char *p = a;//指標a和指標p都指向陣列a的首地址
cout << sizeof (a) << "##" << sizeof (p) << endl;
這時的執行結果是「5##4」
2.作用域以及生存期:
被一組「{}」括起來的部分被稱為一個「域」,在某個域中定義的變數稱為區域性變數,這個區域性變數僅僅在該作用域下有效,一旦離開這個作用域,該變數就消亡;如果遇見多重作用域,外層的變數可在內層起作用,如果遇見內層與外層同名的情況,則內層的同名變數在內層覆蓋外層變數。
舉個例子:
void fun1()
void fun2()
void fun3 ()
//新增加的作用域結束
cout << c << endl;//這裡依然會列印出1,因為這裡的c是第一個定義的c,上面新增的作用域的c已經在其作用域結束的時候消亡。
}好了,上面的基礎知識說完了,現在我們來分析你的程式,第一行出現亂碼是因為在函式getmemory()結束的時候,陣列消亡了,每個元素都消亡了,所以在你列印的時候,系統找不到p1指向的值,因為已經消亡,p1成了野指標,所以出現亂碼,而第二行正常是因為:雖然指標b也在函式中消亡,不過消亡的僅僅只是一個指標,其指向的內容並沒有消亡,而這些內容的首地址已經在getmemory()中賦給了你傳入的指標,所以第二行正確
2樓:匿名使用者
a 你首先要思考下 p1 在getmemory(&p1 , &p2 );之後裡面裝的是什麼? 這裡因該裝的是地址而不是一個變數,你如果要想輸出這個地址裡的值那就加上『* 』號。但輸出的只是首地址的值,至於為什麼3樓的第一點已經說的很詳細了
你可以結合下面的程式分析下
#include
using namespace std;
int main()
3樓:匿名使用者
c大概輸出亂碼
char a = "hello";
定義的陣列a[6]在函式返回後,不存在了,cout< 可以!下面是我學習陣列和指標的總結 1 指向陣列首地址 對於一維陣列a 10 陣列的首地址為a 呼叫 p a a i 或者 p i 對於二維陣列a 3 4 整個陣列的首地址為a 0 呼叫 p a 0 a 0 i 或者 p i 此時a代表陣列第一行的地址。3 指向陣列的每行 形如 int a 3 4 ... 陣列bai名和指標都可以標誌地址,du但是要zhi注意 陣列名是常量,一旦dao你定義了一個數內組,那麼數容組名無法被賦值。指標是變數,是可以被賦值的 例如 int a 10 int b 10 a b 錯誤 不能對a賦值 注意下面 int p 定義一個指標 p a ok,p現在指向a的首地址。p b... int p 4 這個就是行指標 這種型別的指標p是指向一個一維陣列,這個一維陣列包含4個整形元素 但是 int a 4 p a 這種方式卻是不對的 因為p只能指向一個整型的一維陣列,不能指向一個整型資料,a所指向的正是a 0 是個整型數 實際上int p 4 這種型別的指標是用於多維陣列中的,比如定...陣列名和指標的區別C語言中陣列名和指標的區別
C高手中高手進,字元陣列名的屬性到底是不是指標C
c語言中指標陣列和行指標的區別是什麼