陷阱1:傳入乙個無指標的指標變數作為形參,你是無辦法往裡面塞位址或內容的
#include "stdlib.h"
#include "stdio.h"
void ****(char *p)
main()
結果:p
-858993460
p4787976
-858993460
解釋:因為變數的本質其實在計算機裡面並沒有乙個真正的變數名與知對應的,其實也都是位址,這樣傳入相當於乙個根本不存在的位址傳入到了子函式裡面,子函式對它做任何操作其實都是無用功,並不會對主函式裡面的
s指向的虛無的位置有任何作用。
****
函式裡面的
p = (char*)malloc(sizeof(char));
其實僅僅只是弄了個記憶體區域,把首位址給形參變數名對應起來,跟主函式的
s毛關係都沒有。
所以有些人弄了個虛無指標例如char *p,然後裡面沒位址的,塞進scanf("%s",p),想給它賦值是行不通一定錯的,但編譯器除了警告一下會由得你通過。
例子2:
#include "stdlib.h"
#include "stdio.h"
void ****(char * p)
main();
****(s);
printf("%s\n",s);
}
執行結果:
your
(輸入)
abc以為
abc會被替換為y
our?錯了,在形參
p被重新分配記憶體區域位址開始,
p儲存的位址和
s儲存的首位址就已經不是同乙個,那麼
p儲存的位址指向的內容和
s儲存的首位址指向的內容當然就不會是同樣的了,現在無論
p輸入什麼都不會和
s有關係
。陣列和指標、變數本是同根生:例子1
:
main(),*t;
t = &s;
printf("%s\n",s);
t[0]= 'x';
printf("%s\n",s);
}
執行結果:
abcxbc
解釋:t
看起來只是指標而不是陣列,但是卻可以當陣列那樣用,是因為做了
t = &s;
後,無論是陣列變數
s,還是指標變數
t,實際上只要調整其指向的首位址相同,指向的內容也只是同一回事,當然操作也可以一樣了。也側面說明其實陣列變數其實只是一種指向某個連續記憶體空間的一種指標。
例子2:
main()
執行結果:
abcde
這裡等效於
char t[6] =
,結合例子
1,相信大家可以很充分地發現陣列和指標之間的聯絡和等效關係了。
例子3:
main()
*s= '\0';
printf("%s\n",head);
}
執行結果:
abcd
例子4:
main(),*p;
int i = 0;
p= &s;
for(i=0;i<4;i++)
printf("%s\n",s);
}
執行結果:
wxyz
解釋:這裡做的證明是,因為陣列不過只是一種指向連續記憶體區域首位址的一種變數,也正因為如此,這裡做了乙個等效於陣列本質做的工作的一種指標,然後證明用普通變數的方法進行自加和賦值也是可行的。
陷進2:不小心改了指標變數的位址
main()
執行結果:
p指向的位址存的值:5
(最後出錯)
使用指標的時候,一定要注意操作規範,不然很容易擺烏龍,而且基本都可以編譯通過,就是執行出錯而已。
宣告完指標之後,無論是給位址指向的空間賦值還是讀取值,都要用 *指標變數名 來操作
而讀取指標指向的位址(乙個整數)時,直接用 指標變數名 即可
理解費解者可以這麼理解:
指標變數存的是位址,可以理解為門牌號。普通變數存的是住在裡面的人。
指標陣列 陣列指標的分配記憶體及函式引數 C語言版
最近寫 總是被基礎知識卡住,十分耽誤時間,今天又卡住了。所以下定決心一定要弄清楚這個問題,然後不好的是網上的資料總是解決的並不清楚,總是在糾結什麼是指標陣列什麼是陣列指標,看了 c缺陷和陷阱 也沒有我想要的東西。要麼就是c和c 混為一談,new int 5 這種語法c肯定是錯誤的,所以找個機會總結一...
指標與陣列的記憶體分配
部落格搬家 在實踐中經常遇到這樣的情況 二維陣列 指向指標的指標 指標陣列 陣列指標 的使用,經常容易混淆,這裡從記憶體分配的情況進行對比 二維陣列 char a 2 3 二維陣列的記憶體分配情況 指向指標的指標 char p1 指標的指標在記憶體分配時先為指標p1 外層 分配記憶體 p1 char...
C 陣列變數的記憶體分配
原則 1 簡單的值型別的陣列,每個陣列成員是乙個引用 指標 引用到棧上的空間 因為值型別變數的記憶體分配在棧上 2 引用型別,類型別的陣列,每個陣列成員仍是乙個引用 指標 引用到堆上的空間 因為類的例項的記憶體分配在堆上 class person person myperson myperson n...