C語言指針1

前言:指針是 C語言一個重要概念免绿,也是C 語言的一個重要特色。使程序簡潔宅楞、緊湊针姿、高效袱吆。指針乃是C之精華。

數(shù)據(jù)在內(nèi)存中的存儲及讀染嘁:在程序中定義的變量绞绒,在對程序進行編譯時,系統(tǒng)會給變量分配內(nèi)存單元榕暇。編譯系統(tǒng)根據(jù)程序定義的變量類型蓬衡,分配一定長度的空間。內(nèi)存區(qū)的每一個字節(jié)有一個編號彤枢,這就是“地址”狰晚,它相當(dāng)于旅館中的房間號。在地址所標志的內(nèi)存單元中存放的數(shù)據(jù)則相當(dāng)于旅館房間中居住的旅客缴啡。

由于通過地址能找到需要的變量單元壁晒,因此,地址指向該變量單元业栅。將地址形象地稱為“指針”秒咐。通過指針能找到以它為地址的內(nèi)存單元。

區(qū)分:存儲單元的地址 ? ?和 ?存儲單元的內(nèi)容

eg:

int i ,j,k;

printf(”%d”,i)

在程序中碘裕,一般通過變量名引用變量的值携取、實際上,是通過變量名 i 找到存儲單元的地址帮孔,從而對存儲單元進行操作雷滋。

scanf(“%d”,&j)

程序運行時,把鍵盤輸入的值送入到某一地址開始的整形存儲單元中文兢。if k = i + j晤斩;按變量名進行的運算存儲的這種方式,直接按變量名進行的訪問 禽作,稱為 :直接訪問

另外:將變量 i 的地址存放到另一變量中尸昧,然后通過該變量來找到變量i 的地址的方式是間接訪問揩页。

i_pointer = & i; (變量i 所占用單元的起始地址)

一個變量的地址稱為該變量的 “指針”:變量 存放 另一個變量的地址 .-> ?變量稱為:指針變量 地址變量 指針變量的值 是 地址(即地址 ?指針是一個地址 ?指針變量 是一個存放地址的變量)旷偿。

指針變量: 存放地址的變量是指針變量 ,用來指向 另一個 對象(變量爆侣、數(shù)組萍程、函數(shù)等)通過訪問指針變量 可以找到它所指向的變量,從而得到這些變量的值兔仰。

定義:

# include

int main( )

{

int a =100,b =10;

int *p1,*p2;

p1 = &a,p2 = &b;

printf(“a = %d,b = %d”,a,b);

printf(“ *p1 = %d,*p2 = %d”,*p1,*p2); //輸出 a b 的值

}

其中的“*” 茫负,表示 “指向”。*p1 表示 指針變量p1 指向的變量a.

定義時: *p1 和 *p2 ?表示定義兩個指針變量乎赴。前面的“*” 表示該變量為指針變量忍法。無定義時潮尝,表示的是 指針變量指向的 變量。

類型名 * 指針變量名饿序;可定義時 初始化勉失;

int * p1 = &a;

注:指針變量的“*”表示該變量的類型為指針型變量。

定義時原探,必須制定基類型乱凿。不同數(shù)據(jù)類型在內(nèi)存中占據(jù)不同的存儲單元。

一個變量的指針的含義:以存儲單元編號表示的地址(如2000開始的字節(jié))咽弦,指向的存儲單元的數(shù)據(jù)類型徒蟆。float char .

指針變量只能存放地址。

2.引用指針變量

(1)型型、給指針變量賦值段审。

p = &a; //把 a的地址付給 指針變量 p;

指針變亮 p ?的值 是 變量a 的地址。p ?指向 a .p 是指向 整形數(shù)據(jù)的指針變量闹蒜。

(2)戚哎、引用指針變量 指向的 變量。

如果執(zhí)行了1 ?操作嫂用、即p 是指向 整形數(shù)據(jù)的指針變量型凳。

則printf(“%d”,*p); 其作用是以整數(shù)形式輸出 指針變量p ?所指向的 變量的值。即變量 a 的值嘱函。

如果有賦值語句:

*p = 1; // 表示 將 整數(shù) 1 賦給 p當(dāng)前 所指向的變量甘畅。 即 a = 1;

(3)、引用指針變量的值

printf(“ %o”,p); // 以八進制的形式輸出指針變量的 p的值往弓,即 a ? 的值疏唾。

注:1.& 取地址符 。* 指針運算符(或 間接訪問 ?運算符)*p 代表指針變量 p ? 指向的對象函似。

eg :輸入 a and b ?兩個整數(shù)槐脏,按大小順序 輸出 a 和 b;

# include

int main( )

{

int *p1,*p2,*p,a,b;

printf(“enter two number:”);

scanf(“%d,%d”,&a,&b);

p1 = &a;

p2 = &b;

if(a < b)

{

p = p1;p1 = p2;p2 = p; // p1 = &b;p2 = &a;不交換 整形變量的值 而是改變指針的值。

printf(“a = %d,b = %d”,a,b);

printf(“max = %d,min = %d”,*p1,*p2);

}

return 0;

}

3撇寞、指針變量 作為 ? 函數(shù) ?參數(shù)

函數(shù)的參數(shù)不僅可以使 整形 浮點型 字符~顿天,指針類型。其作用是將一個 ? ?變量的地址 ? 傳送到 另一個函數(shù)中蔑担。

上列:定義一個函數(shù) 將指向 ?兩個整形變量 的 指針變量 作為實參 傳遞給 函數(shù)的形參指針變量牌废,在函數(shù)中 通過指針 實現(xiàn)交換兩個變量的 值。

# include

int main ( ?)

{

void swap(int *p1,int * p2);

{

int a,b;

int *pointer_1,*pointer_2;

printf(“enter a and b:”);

scanf(“%d,%d”,&a,&b);

pointer_1 = &a;

pointer_2 = &b;

if(a < b) swap(pointer_1,pointer_2);

printf(“max = %d,min = %d”,a,b);

}

return 0;

}

void swap(int *p1,int *p2)

{

int ?temp;

temp = *p1;

*p1 = ?*p2;

*p2 = temp;( 指針前面有賦值符號 表示值 ?無啤握,表示 指向的對象)

}

注:在函數(shù)傳遞時鸟缕,將實際參數(shù)的值傳遞給形式參數(shù)變量,采取的是“值傳遞”的方式。傳遞后 p1 的值 為 &a.這時 懂从,p1 and pointer_1都指向 變量 a授段。調(diào)用結(jié)束后,形參 p1 p2 釋放番甩。 ?這改變了變量的值 畴蒲、行參的值的改變不能改變實際參的值。而應(yīng)該用指針變量作為函數(shù)參數(shù)对室,在函數(shù)執(zhí)行過程中使指針變量 所指向的變量發(fā)生變化模燥,函數(shù)調(diào)用結(jié)束后,變量值的變化 保留掩宜;

注:不能通過改變指針形參的值而使指針實參 的值 改變蔫骂。

不能通過執(zhí)行調(diào)用函數(shù)來改變實參指針變量的值,但是可以通過改變實參指針變量所指向的值牺汤;

eg:

# include

int main( ?)

{

void exchange(int *q1,int *q2,int *q3);

int a,b,c,*p1,*p2,*p3;

printf(“enter three number:”);

scanf(“%d,%d,%d”,&a,&b,&c);

p1 = &a;p2 = &b;p3 = &c;

exchange(p1,p2,p3);

printf(“the order is:%d,%d,%d\n”,a,b,c);

}

void exchange(int *q1,int *q2,int *q3 )

{

void ?swap(int *p1,int *p2);

if(*q1 < *q2 ) swap(q1,q2);

if(*q1 < *q3) swap(q1,q3);

if(*q2 < *q3) swap(q2.q3);

}

void swap(int *p1,int *p2)

{

int temp;

temp = *p1;

*p1 = ?*p2;

*p2 = temp; ? ? // 實現(xiàn) ? 交換 ?兩個變量 ?的值的 函數(shù)

}

(4).通過指針引用數(shù)組

一個變量有地址辽旋,一個數(shù)組由若干個元素,每個數(shù)組元素在內(nèi)存中 占用 存儲單元檐迟,有相應(yīng)的地址补胚。可指變量追迟,也可指數(shù)組(把某一元素的地址放到 一個指針變量中)溶其。數(shù)組元素的指針 就是 數(shù)組 元素的 地址。

int a[3] = {1,2,3};

int *p;

p = &a[0];p = a//p 是數(shù)組a首元素的地址敦间。將數(shù)組元素的首地址賦給指針變量 P瓶逃。

5、引用數(shù)組元素時 指針的運算

1廓块、在引用數(shù)組元素時厢绝,可以對指針進行如下的運算:

加一個整數(shù),P+1带猴;

自加運算昔汉,++P,P++拴清;

自減運算靶病,--P,P--贷掖;

兩個指針相減嫡秕,P1- P2;

(1)苹威,如果指針變量指向一個元素,P+1 指向同一數(shù)組中的下一個元素(同P-1)驾凶。+ 的是字節(jié)數(shù)哦 ? ? ? ? (~v~)

(2) P+ i 和 a +i 代表同一個地址a[ i ]. ?P 指向 &a[0]

(3)指針加法無意義哦

6牙甫、通過指針引用數(shù)組元素

1>下標法 如 a[i]形式掷酗。

2>指針法 如*(a+i) 或者 *(p+i).

有一個整形數(shù)組a,有十個元素,輸出數(shù)組中的全部元素窟哺。

int main( )

{

int a[10];

int i;

printf(“enter ten integer number:")

for(i = 0;i < 10;i++)scanf(“%d”,&a[i]);

for(i = 0;I < 10;i++) printf(“%d”,a[i]);

printf(“\n”);

return 0;

}

// =========================================

int main( )

{

int a[10];

int i;

printf(“enter ten integer number:")

for(i = 0;i < 10;i++)scanf(“%d”,&a[i]);

for(i = 0;I < 10;i++) printf(“%d”,*(a+i);

printf(“\n”);

return 0;

}

用指針變量指向數(shù)組元素

int a[10];

int *p,i;

printf(“enter ten integer number:”);

for(i = 0;i < 10;i++) scanf(“%d”,&a[i]); // for(p = a;p < (a+10);p++) scanf(“%d”,p); 用指針變量表示 當(dāng)前元素的地址

for(p = a ; p < (a +10);p++) ?printf(“%d”,*p);

int main( )

{

int a[10];

int i;

printf(“enter ten integer number:")

for(i = 0;i < 10;i++)scanf(“%d”,&a[i]);

for(i = 0;I < 10;i++) printf(“%d”,*(a+i);

printf(“\n”);

return 0;

}

for 循環(huán)中 P 的值要重新賦值 泻轰。

# include

int main( ?)

{

int i,a[10],*p = a;

printf(“enter ten integer numbers:”);

for(i = 0; i < 10 ;i++) scanf(“%d”,p++);

p = a;

for(“i = 0;i < 10;i++,p++”) printf(“%d”,*p);

printf(“\n”);

return 0;

}

在編譯時,對下標的處理是轉(zhuǎn)化為地址的: 對P[i] ?處理成 *(p+i), ?如果P 是指向一個數(shù)組元素 a[0], 則 p[i] 代表 a[i];

//==================

*p++ :++ 和* 同優(yōu)先級 ?結(jié)合方向自右向左且轨,等價于*(p++),先引用 P的值浮声,實現(xiàn)*P 運算 ,然后 再使P 自加 1.

用數(shù)組名做函數(shù)參數(shù)

1旋奢、當(dāng)用數(shù)組名做參數(shù)時泳挥,如果形參數(shù)組中 各元素 的值 發(fā)生改變,實參數(shù)組元素 的值 隨之發(fā)生變化至朗。cause:

void ?swap (int x,int y); swap (a[1],a[2]);

當(dāng)調(diào)用函數(shù)改變兩個值的交換時屉符,a[1] a[2] 的值 并不改變。實參和形參的值傳遞锹引。

fun(int arr[],int n);fun(int *p,int n);只有指針變量存放地址矗钟。

、通過這種方法改變實參數(shù)組 中的值嫌变。

用函數(shù)將數(shù)組中的元素調(diào)換順序吨艇。

行參數(shù)組名可以用數(shù)組名,也可用指針變量名腾啥。

# include

int main()

{

void inv (int x[ ],int n);

int i,a[10] = {3,1,22,88,8,0,10,20,77,89};

printf(“the original array is:”);

for (i = 0 ;i < 10; i++) printf(“%d”,a[i]);

printf(“\n”);

inv(a,10);

printf(“the array has been inverted:\n”);

for(i = 0;i < 10;i++) ? printf(“%d”,a[i]);

printf(“\0”);

return 0;

}

void inv(int x[ ],int n)

{

int temp,i,j,m = (n -1)/2;

for(i = 0;i <= m;i++)

{

j = n - 1 -i;

temp = x[i];x[i] = x[j];x[j] = temp;

}

return 0;

}

//====================

# include

int main( )

{

void sort(int x[ ],int n);

int i,*p,a[10];

p = a;

printf(“enter ten integer numbers:”);

for(i = 0;i < 10;i++) scanf(“%d”,p++);

p = a; ?/ 重新指向a[0];

sort(p,10);

for(p = a,i = 0;i < 10;i++)

{

printf(“%d”,*p);

p++;

}

printf(“\n”);

}

void sort(int x[ ],int n)

{

int i,j,k,t;

for(i = 0;i < n-1;i++)

{

k = i;

for(j = i +1;j

{

if(x[ j ] > x[ k ]) ? k = j;

if(k != i)

{

t = x[ i ];x[ i ] = x[k]; x[k] = t;

}

}

}

}

/*

void sort(int *x,int n)

{

int j,i,k,t;

for(i = 0;i < n -1;i++ )

{

k = i;

for(j = i+1,j < n;j++)

if(*(x+j) > *(x+k)) k = j;

if(k != i))

{

t = *(x+i);*(x+i) = *x(x+k);*(x+k) = t;

}

}

}

*/

2.通過指針引用多維數(shù)組

int a[3][4] = {{1,2,3,4},{2,3,5,6}};

表示形式 ? ? ? ? ? ? ? ? 含義 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?地址

a ? ? ? ? ? ? ?|二維數(shù)組名 ? 指向一維數(shù)組a[0], 即0行首地址|? 200 0

a[0] ? *(a+0) *a ? ? ? 0行0列 元素地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2000

a[1] +2  *(a+1) +2 ?&[1][2] ? ?1 行2列的地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2024

a[1] ? *(a +1) ? ? ?1行0 列的地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2016

a + 1 ?代表一行中全部元素占用字節(jié)數(shù)秸应。16

a[0] + 1 中的 1 代表一個a 元素占用的字節(jié)數(shù)。4

碑宴、輸出二維數(shù)組中任一行软啼,任一列元素的值

# include

int main ( )

{

int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};

int (*p)[4] ,i,j;

p = a;

printf(“enter row andcolum:”);

scanf(“%d,%d”,&i,&j);

printf(“a[%d][%d]?= %d\n”,i,j,*(*(p +i)+ j));

}

//========================================

# include

int main ( )

{

void search (float (*p)[4],int n);

float score[3][4] = {{65,57,70,60},{58,87,90,81},{90,99,100,98}};

search(score,3);

return 0;

}

// 定義一個函數(shù)

void search (float (*p)[4],int n)

{

int i,j,flag;

for(j = 0;j < n;j++)

{

flag = 0;

for(i = 0;i < 4;i++)if(*(*(p +j) + i ) < 60) flag = 1;

if(flag == 1)

{

printf(“No.%d fails,his score are:\n”,j+1);

for(i = 0;i < 4;i++)printf(“%5.1f”,*(*(p + j) + i);

printf(“\n”);

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市延柠,隨后出現(xiàn)的幾起案子祸挪,更是在濱河造成了極大的恐慌,老刑警劉巖贞间,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿条,死亡現(xiàn)場離奇詭異,居然都是意外死亡增热,警方通過查閱死者的電腦和手機整以,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峻仇,“玉大人公黑,你說我怎么就攤上這事。” “怎么了凡蚜?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵人断,是天一觀的道長。 經(jīng)常有香客問我朝蜘,道長恶迈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任谱醇,我火速辦了婚禮暇仲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘副渴。我一直安慰自己奈附,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布佳晶。 她就那樣靜靜地躺著桅狠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轿秧。 梳的紋絲不亂的頭發(fā)上中跌,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音菇篡,去河邊找鬼漩符。 笑死,一個胖子當(dāng)著我的面吹牛驱还,可吹牛的內(nèi)容都是我干的嗜暴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼议蟆,長吁一口氣:“原來是場噩夢啊……” “哼闷沥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咐容,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤舆逃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戳粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體路狮,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年蔚约,在試婚紗的時候發(fā)現(xiàn)自己被綠了奄妨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苹祟,死狀恐怖砸抛,靈堂內(nèi)的尸體忽然破棺而出评雌,到底是詐尸還是另有隱情,我是刑警寧澤锰悼,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布柳骄,位于F島的核電站团赏,受9級特大地震影響箕般,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舔清,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一丝里、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧体谒,春花似錦杯聚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至故响,卻和暖如春傀广,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彩届。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工伪冰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人樟蠕。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓贮聂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寨辩。 傳聞我的和親對象是個殘疾皇子吓懈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容