日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言之指针与数组总结

發(fā)布時(shí)間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言之指针与数组总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

和指針相關(guān)的問(wèn)題口訣1

1. 地址變量得地址,得誰(shuí)地址指向誰(shuí)

和指針相關(guān)的問(wèn)題要畫(huà)圖: 內(nèi)容變量畫(huà)房子,指針畫(huà)箭頭

---->口

----------------------------------------------------

和指針相關(guān)的兩個(gè)特殊運(yùn)算符:

一、"&" 取地址運(yùn)算符,通過(guò)&運(yùn)算符可以取出普通變量的地址;

二、"*"? 有兩種意義:

?? 1.? 為指針標(biāo)志: 是否為指針標(biāo)志主要看前面是否有類型,此處有一個(gè)int

?? 2.? 為指針運(yùn)算符:

  ? ?在等號(hào)右面為取值。*可以取出指針變量所指向的普通變量的值。

 ?   在等號(hào)左面為賦值。*可以將指針變量所指向的普通變量的值,修改為其他。

? ? ? ? 口訣2有* 為內(nèi)容值,不是讀就是寫(xiě)。等號(hào)左面為賦值, 其余都為取值。

? ?3.? 為乘法運(yùn)算符。當(dāng)且僅當(dāng)左右的都為變量時(shí)。略。

int a, b =20, c=30, d=40, *p; (正確,此處的*為指針標(biāo)志,只起到定義的左右,沒(méi)有取值和賦值的作用。是否為指針標(biāo)志主要看前面是否有類型,此處最前面有一個(gè)int)

p=&d; (正確,p指向d的地址)

a=*p;? (正確,此處的*為取值。最后結(jié)果a的值變?yōu)榱薲的值40)

*p =c; (正確,此處的*為賦值。最后結(jié)果d的值變?yōu)榱薈的值30)

*p =&b; (運(yùn)行錯(cuò)誤,左邊為內(nèi)容值,右邊為地址,不等價(jià))

--------------------------------------------------------

和指針相關(guān)的等價(jià)表達(dá)式

若指針變量p指向變量a,即將變量a的地址賦給了指針變量p.

如:int a=20, int *p=&a;

則有如下結(jié)果:

A、*p <=> a

B、 p <=> &a

C、 &*p <=> &a <=> p

D、*&a <=> *p <=> a

E、 (*p)++? a++?

???? (*p)--? a-- ???

???? ++(*p)? ++a?? ++*p ??

??? ? --(*p)? --a?? --*p

可以看出 * 和 & 是互逆的兩個(gè)運(yùn)算符

--------------------------------------------------------

所有的指針變量在內(nèi)存中分配的字節(jié)數(shù)相同 sizeof(指針) 永遠(yuǎn)是 兩個(gè)字節(jié), 不管指針定義時(shí)是 int *, float * 還是 double * . 詳細(xì)如下

int *p1; ? 則 p1以后必須指向int 類型的變量。 ? 但指針本身的長(zhǎng)度,sizeof(p1) 為2個(gè)字節(jié)(2*8bit -16bit)

float *p2; ? 則 p2以后必須指向float?類型的變量。 ? 但指針本身的長(zhǎng)度,sizeof(p2) 為2個(gè)字節(jié)(2*8bit -16bit)

double *p3; ? 則 p3以后必須指向double?類型的變量。 ? 但指針本身的長(zhǎng)度,sizeof(p3) 為2個(gè)字節(jié)(2*8bit -16bit)

-----------------------------------------------------------

四道例題:

例子1.

void fun (int *x , int *y) {
  printf("%d, %d", *x, *y) ;
  *x = 3;
  *y = 4;
}

main()
{
int x = 1, y = 2
fun(&y, &x);
printf("%d, %d", x, y);
}


結(jié)果
2, 1
4, 3

注意main在調(diào)用fun函數(shù)時(shí), y 和x故意寫(xiě)顛倒了。

?--------------------------------------------------------------

例子2.?

#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

如果在控制臺(tái)輸入??2 和 5

則輸出結(jié)果為?

5, 2

原因: 在調(diào)用swap函數(shù)時(shí)使用了職稱,所以在swap函數(shù)內(nèi)部對(duì)p1,p2 所引用的內(nèi)容值的修改,會(huì)影響外面的a和b的值。

?--------------------------------------------------------------

例子3:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2不同, swap函數(shù)中的temp為指針,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

但最后的打印結(jié)果仍為
2,5


原因是:雖然main中調(diào)用swap函數(shù)時(shí)使用了指針傳遞,但swap函數(shù)中的所有操作都是:將指針本身的修改,而沒(méi)有再次使用*操作符來(lái)修改“指針指向的內(nèi)容值”

口訣3:沒(méi)有*的指針操作為地址,地址的賦值意味著改指向。

---------------------------------------------------------------------

例子4:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2很像。但唯一不同是,temp定義為指針而不是普通變量。看上去似乎應(yīng)該和2的輸出結(jié)果一樣,仍為
2,5 。

但實(shí)際運(yùn)行時(shí)編譯器會(huì)報(bào)錯(cuò):非法的內(nèi)存寫(xiě)入。

原因是:temp為野指針,并沒(méi)有預(yù)訂指向哪里。如果指向系統(tǒng)區(qū),則可能導(dǎo)致操作系統(tǒng)死機(jī)或崩潰。

如果temp在定義后,馬上給一個(gè)初始值,就不會(huì)有問(wèn)題了。

?---------------------------------------------------------------------

指針、數(shù)組的等價(jià)符號(hào)

若將數(shù)組作為形參,則將數(shù)組名作為指針變量來(lái)處理。

int fun(int a[10]) <=> int fun(int *a) <=> int fun(int a[])

可以看出,口訣4: ?&與*互逆。 *與[]等價(jià), &與[]互逆

?

例子5:

int s[10], a, b;
in d[3][6];

?

int *p;
p=&a; //p 指向了整數(shù)a
p = &s[2]; //p指向了s數(shù)組的第二個(gè)元素
p= &d[2][4];p指向了d數(shù)組的第二行、第四列的元素。

所以,以上的語(yǔ)句都是對(duì)的。

?

上面的例子:

1. 定義了一個(gè)int s[10]; ? 則 s等同于 &s[0]. ? 即,看到一個(gè)數(shù)組,就馬上聯(lián)想到他代表的是數(shù)組第一個(gè)元素的地址。

? ??在C語(yǔ)言中規(guī)定,數(shù)據(jù)名代表數(shù)組的首地址,并且是一個(gè)地址常量

2. 另外,如果定義了一個(gè)指針 int *ppp = s; ?則 ? ppp?定價(jià)于s, ?同時(shí)等價(jià)于?&s[0]。

?---------------------------------------------------------------------

指針的加減:


當(dāng)指針變量指向數(shù)組中的某一個(gè)地址時(shí),指針變量加1后指向數(shù)組的下一個(gè)元素,
指針變量減1時(shí)指向數(shù)組的前一個(gè)元素。

?例子6:

?

float a[10]; float *p;
p=&a[4]; 則p-3指向?

先畫(huà)圖:

a[0] |?a[1] |?a[2] |?a[3] |?a[4] | ...

p的初始位置指向了 a[4], ?則?p-3 為向前3個(gè),指向了 a[1]

?口訣5: ?指針的加減是向前或向后移動(dòng)了n個(gè)元素

?---------------------------------------------------------------------

int a[N], *p=a;

則有:

地址三等價(jià):

存在等價(jià)表達(dá)式:

p+i <=> a+i <=> &a[i] ?代表的是第i個(gè)元素的地址

元素四等價(jià):

存在等價(jià)表達(dá)式:

1. ? *(p+i)?<=> *(a+i)?<=> a[i] ? 代表的是第i個(gè)元素的值

2. ?另外,還有 p[i]?<=>?a[i] 。?p[i] 的用法不多見(jiàn),但無(wú)任何錯(cuò)誤,代表的也是第i個(gè)元素的值。原因是p和a完全等價(jià)。

整理出來(lái)的等價(jià)式如下:

a) *(p+i) <=> *(a+i) <=> a[i] <=> p[i]
b) p++ <=>?++p <=>? p+=1 <=>? p=p+1
c) p-- <=>??--p ?<=>? p-=1 ?<=>? p=p-1
d) *p++ ?<=>? ?*(p++)
? ?說(shuō)明:* 與 ++ 的運(yùn)算優(yōu)先級(jí)一樣,所以按照從右到左的結(jié)合原則,先執(zhí)行++,后執(zhí)行*
? ?++在p的后面,為執(zhí)行后再加。即先把p的值取出,指針再加1.
e) *++p ?<=>? *(++p)
? ? ++在p的前面,為先加再執(zhí)行。即先把指針加1, 再把移動(dòng)后的p所指向的值取出,
f) (*p)++ <=>?? ++(*p) ?<=>?? ++*p
? ? 將p的內(nèi)容自增
g) (*p)-- ?<=>??--(*p) ?<=>?? --*p
? ? 將p的內(nèi)容自減

?

總結(jié)

以上是生活随笔為你收集整理的C语言之指针与数组总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。