初識(shí)C語(yǔ)言(指針)-創(chuàng)新互聯(lián)

文章目錄
  • 一、什么是指針?
    • ?內(nèi)存
    • ?指針和指針變量
    • ?總結(jié)
  • 二、指針的使用
    • 2.1 指針類(lèi)型
      • ?定義
      • ?意義
      • ?二級(jí)指針(用來(lái)存放指針的指針)
    • 2.2 訪(fǎng)問(wèn)指針
      • ?一般變量
      • ?數(shù)組
    • 2.3 指針運(yùn)算
  • 三、注意事項(xiàng)
    • 野指針(指針指向的位置是不可知的)

創(chuàng)新互聯(lián)建站是專(zhuān)業(yè)的豐南網(wǎng)站建設(shè)公司,豐南接單;提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行豐南網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!一、什么是指針?

在了解指針之前,我們需要對(duì)內(nèi)存有一個(gè)了解。

?內(nèi)存

概念:電腦上的存儲(chǔ)設(shè)備,程序運(yùn)行的時(shí)候會(huì)加載到內(nèi)存中,并使用

如何使用:
正如生活中,我們會(huì)把高樓大廈分成一層層、一個(gè)個(gè)小房間,以便實(shí)現(xiàn)查找。而計(jì)算機(jī)也將內(nèi)存分為了一個(gè)個(gè)小房間,并給每一個(gè)房間分配了地址編號(hào),我們可以通過(guò)這個(gè)編號(hào)去找到每一個(gè)內(nèi)存單元,而這意義其實(shí)就等同于地址

?指針和指針變量

之前在【內(nèi)存】模塊,以及介紹了指針的概念,即編號(hào)=地址=指針

那么如何產(chǎn)生地址/編號(hào)?
計(jì)算機(jī)有32/64根地址線(xiàn),下面我們以32位計(jì)算機(jī)為例,64位同理

32位計(jì)算機(jī),假設(shè)有32位地址線(xiàn),每根地址線(xiàn)在尋址的時(shí)候會(huì)產(chǎn)生高電平和低電平,就是1或者0。

那么32根地址線(xiàn)產(chǎn)生的地址就是從00000000000000000000000000000000~11111111111111111111111111111111一共2^32次方個(gè)地址,這些地址就是一個(gè)個(gè)編號(hào)/指針

每一個(gè)指針對(duì)應(yīng)的內(nèi)存單元多大------一個(gè)字節(jié),記住就好
每一個(gè)地址標(biāo)識(shí)一個(gè)字節(jié),那我們就可以給2^32(Byte)/1024(KB)/1024(MB)/1024(GB)---->4GB的空間進(jìn)行編址

指針變量是什么
我們可以通過(guò)&,取出變量的內(nèi)存起始地址(取出的是第一個(gè)字節(jié)的地址),把地址存放到一個(gè)變量中,這個(gè)變量就是指針變量

在尋址的時(shí)候會(huì)產(chǎn)生地址,在32位的機(jī)器上,地址是32個(gè)0或者1組成2進(jìn)制序列,那地址就得用4個(gè)字節(jié)的空間來(lái)存儲(chǔ),所以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié);在64位機(jī)器上,如果有64根地址線(xiàn),那一個(gè)指針變量的大小是8個(gè)字節(jié),才能存放一個(gè)地址

int main()
{int a = 10;    //在內(nèi)存開(kāi)辟一塊空間,a占用4個(gè)字節(jié)空間
	int* pa = &a;  //把a(bǔ)的第一個(gè)字節(jié)的地址取出來(lái),放到pa中,pa就是指針變量
	return 0;
}
?總結(jié)
  • 指針是內(nèi)存中一個(gè)最小單元的編號(hào),也就是地址。它的產(chǎn)生依托與地址線(xiàn)的尋址
  • 平時(shí)口語(yǔ)中說(shuō)的指針,通常指的是指針變量,是用來(lái)存放內(nèi)存地址的變量
  • 指針變量是用來(lái)存放地址的,地址是唯一標(biāo)示一個(gè)內(nèi)存單元的
  • 指針的大小在32位平臺(tái)是4個(gè)字節(jié),在64位平臺(tái)是8個(gè)字節(jié)
二、指針的使用 2.1 指針類(lèi)型 ?定義
int a = 0;
int* pa = &a;             int*類(lèi)型的指針,是為了存放int類(lèi)型變量的地址

*是指,pa是一個(gè)指針變量,用來(lái)存放a的地址

int是值,pa所存放地址的對(duì)象是int類(lèi)型的

😊指針數(shù)組

int* arr[5];
?意義

指針類(lèi)型有許多種,如int*、char*……。那么不同的指針類(lèi)型究竟有什么意義呢?---------------提供了不同的視角去觀(guān)看和訪(fǎng)問(wèn)內(nèi)存

char* ????????一次訪(fǎng)問(wèn)(解引用)1個(gè)字節(jié),+1跳過(guò)1個(gè)字節(jié)
int* ????????一次訪(fǎng)問(wèn)(解引用)4個(gè)字節(jié),+1跳過(guò)4個(gè)字節(jié)

?二級(jí)指針(用來(lái)存放指針的指針)
int a = 10;
int* pa = &a;       //取出a的地址,放到pa上
int** ppa = &pa;    //取出pa的地址,放到ppa上

int b = 20;
*ppa = &b;     //等價(jià)于pa = &b;

**ppa = 30:
//等價(jià)于*pa = 30
//等價(jià)于a = 30

【int** ppa】:
第一個(gè)*是int *的一部分,表明ppa所存的地址的對(duì)象是int *類(lèi)型的
第二個(gè) *表明ppa是一個(gè)指針

2.2 訪(fǎng)問(wèn)指針 ?一般變量

我們存的是一個(gè)地址,而要通過(guò)一個(gè)地址去尋找(訪(fǎng)問(wèn))對(duì)應(yīng)的那個(gè)變量,就需要*(解引用)

#includeint main()
{int a = 10;
	int* pa = &a;
	printf("%p\n", &a);
	printf("%p\n", pa);
	*pa = 20;
	printf("%d\n", *pa);
	printf("%d\n", a);
	return 0;
}

在這里插入圖片描述

聯(lián)系之前的【意義】

char* ????????一次訪(fǎng)問(wèn)(解引用)1個(gè)字節(jié),+1跳過(guò)1個(gè)字節(jié)
int* ????????一次訪(fǎng)問(wèn)(解引用)4個(gè)字節(jié),+1跳過(guò)4個(gè)字節(jié)

?數(shù)組
  • 數(shù)組名本身就是一個(gè)地址(除了sizeof(數(shù)組名)和&數(shù)組名)
  • *(arr+i) = arr[i];????????arr+i = &arr[i];
2.3 指針運(yùn)算
  • 指針±整數(shù)
    根據(jù)指針的類(lèi)型,看跳幾個(gè)字節(jié)

  • 指針-指針
    前提:兩個(gè)指針要指向同一塊空間,而且類(lèi)型也要相同

    結(jié)果:指針-指針的絕對(duì)值,得到的是兩個(gè)指針之間的元素個(gè)數(shù)

int main()
{int arr[8] = {1,2,3,4,5,6,7,8 };

	printf("%d", &arr[8] - &arr[0]);
	return 0;
}
  • 指針的關(guān)系運(yùn)算
    注意:標(biāo)準(zhǔn)規(guī)定,允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許與指向第一個(gè)元素之前的那個(gè)內(nèi)存位置的指針進(jìn)行比較
三、注意事項(xiàng) 野指針(指針指向的位置是不可知的)

野指針,即那些危險(xiǎn)的指針,下面幾種錯(cuò)誤操作會(huì)產(chǎn)生野指針,需要注意

  • 未初始化就訪(fǎng)問(wèn)
int main()
{int* pa;
	*pa = 20;      //局部變量指針未初始化,默認(rèn)為隨機(jī)值
	return 0;
}
  • 指針越界
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int* pa = arr;
	int i = 0;
	for (i = 0; i<= 11; i++)
	{*(pa++) = i;
	}
	return 0;
}
  • 訪(fǎng)問(wèn)空指針
int main()
{int* pa = NULL;       //沒(méi)有有效的地址,就暫時(shí)先放一個(gè)空指針,相當(dāng)于把狗栓了起來(lái)
	*(pa++);              //雖然還是有潛在危險(xiǎn),但是只要你不去主動(dòng)招惹他就問(wèn)題不大
	                      //總體還是比野指針要安全
	return 0;
}
  • 指針指向的空間釋放
int* test(void)
{int a = 10;
	return &a;       
}
int main()
{int* pa = test();
	printf("%d", *pa);    //這個(gè)時(shí)候,這個(gè)地址已經(jīng)還給操作系統(tǒng)了
	return 0;
}

如何規(guī)避野指針

  • 指針初始化
  • 小心指針越界
  • 指針指向空間釋放,及時(shí)置NULL
  • 避免返回局部變量的地址
  • 指針使用之前檢查有效性

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享文章:初識(shí)C語(yǔ)言(指針)-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article12/doogdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名