大家好,c語(yǔ)言指針怎么用相信很多的網(wǎng)友都不是很明白,包括c語(yǔ)言指針知識(shí)點(diǎn)總結(jié)也是一樣,不過(guò)沒(méi)有關(guān)系,接下來(lái)就來(lái)為大家分享關(guān)于c語(yǔ)言指針怎么用和c語(yǔ)言指針知識(shí)點(diǎn)總結(jié)的一些知識(shí)點(diǎn),大家可以關(guān)注收藏,免得下次來(lái)找不到哦,下面我們開始吧!
C語(yǔ)言指針到底是什么,該怎么用呢
在C語(yǔ)言中我們可以認(rèn)為指針就是地址,不過(guò)是某一個(gè)具體內(nèi)存單元的地址。
如我們?cè)赾語(yǔ)言中定義了一個(gè)int型變量a:
inta;
那么計(jì)算機(jī)就會(huì)給a分配4個(gè)字節(jié)的地址(在vc++中,在某些版本的c語(yǔ)言中,可能是2個(gè)字節(jié))來(lái)存放a的值。由于在內(nèi)存中每個(gè)字節(jié)都有一個(gè)地址,那么哪個(gè)地址是a的地址呢?我們不能同時(shí)用4個(gè)地址來(lái)表示a的地址吧,所以在c語(yǔ)言中,我們拿這塊空間(4個(gè)字節(jié))的第一個(gè)字節(jié)的地址當(dāng)作變量a的地址,也就是首地址。
然后我們?cè)诙x一個(gè)指針變量,如:
int*p;
再用取地址運(yùn)算符把a(bǔ)的首地址取出來(lái)賦值給指針變量p,如:
p=&a;
現(xiàn)在指針變量p里存放的就是a的地址,我們就稱p是a的指針。
c語(yǔ)言文件指針是如何推進(jìn)的
1,沒(méi)有必要用幾個(gè)文件指針打開同一個(gè)文件,不要在一個(gè)打開了沒(méi)有關(guān)閉的情況下再次打開。
2.c語(yǔ)言中可以用fseek來(lái)定位文件指針的位置fseek(fp,offset,SEEK_SET);fseek(fp,offset,SEEK_CUR);fseek(fp,offset,SEEK_END);fp為打開的文件指針,offset為相對(duì)偏移SEEK_SET表示從文件起始位置開始計(jì)算SEEK_CUR表示當(dāng)前位置開始計(jì)算SEEK_END表示從文件尾部開始計(jì)算例如:定位到20字節(jié)的位置fseek(fp,20,SEEK_SET)定位當(dāng)前位置后的20字節(jié)fseek(fp,20,SEEK_CUR)定位到倒數(shù)第十個(gè)字節(jié)fseek(fp,-10,SEEK_END)要在文件內(nèi)進(jìn)行來(lái)回跳躍性的處理,可以用多個(gè)變量記住多個(gè)位置
C語(yǔ)言行指針
先舉個(gè)例子吧,先定義一個(gè)二維數(shù)組inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}數(shù)組名a就是一個(gè)行指針,a[0]就是一個(gè)列指針;就拿這個(gè)例子說(shuō)吧,a和a[0]雖然地址相同,可是指針指向類型卻不同,對(duì)指針進(jìn)行+1運(yùn)算,顯然得到的結(jié)果是不同的,因此a(行指針)+1中的"1”代表一行中全部元素所占的字節(jié)數(shù),而a[0]+1,這里的1則是一個(gè)元素所占的字節(jié)數(shù),是兩個(gè)不同的概念。為了說(shuō)明這個(gè)容易搞混的問(wèn)題,可以用軍訓(xùn)中排隊(duì)點(diǎn)名來(lái)說(shuō)明。
班長(zhǎng)逐個(gè)檢查本班戰(zhàn)士是否在隊(duì)列中,班長(zhǎng)每移動(dòng)一步,走過(guò)一個(gè)戰(zhàn)士,而排長(zhǎng)點(diǎn)名只檢查本排各各班是否到齊。
排長(zhǎng)只從第0班的起始位置走到第1個(gè)班的起始位置,看來(lái)只走了一步,但實(shí)際上他跳過(guò)了10個(gè)戰(zhàn)士,這相當(dāng)于a+1,班長(zhǎng)面對(duì)的戰(zhàn)士,排長(zhǎng)面對(duì)的是班,班長(zhǎng)相當(dāng)對(duì)列指針,排長(zhǎng)相當(dāng)于行指針。
為了找到某個(gè)班內(nèi)的某一個(gè)戰(zhàn)士,必須給出兩個(gè)參數(shù)
怎樣熟練掌握C語(yǔ)言的指針
C語(yǔ)言指針就是這門語(yǔ)言的靈魂,說(shuō)難學(xué),那肯定是有難度的,畢竟這是業(yè)界公認(rèn)的。但是如果你熟練掌握了指針的話,它又將會(huì)成為你手中的一柄利器。下面就詳細(xì)的分享一下指針該如何深入的去理解它以及如何熟練的應(yīng)用它
理解指針首先,你需要掌握兩個(gè)運(yùn)算符“*”和“&”;
“&”運(yùn)算符:取對(duì)象在內(nèi)存中的地址
“*”運(yùn)算符:取內(nèi)存中地址上的對(duì)象(值);
大家一定要深刻的理解上面兩個(gè)運(yùn)算符,然后才能去進(jìn)一步理解指針;
inta=100;這一行代碼我想大家都沒(méi)問(wèn)題。那么“&a”返回的就是對(duì)象(變量)a在內(nèi)存中的地址,它是一個(gè)16進(jìn)制數(shù)。
然后用“*”號(hào)去a的地址去取對(duì)象:“*(&a)”,,就能取到對(duì)象a,也就就是100;
接下來(lái)進(jìn)入重點(diǎn)了,指針,本身也是一個(gè)變量(對(duì)象),它本身占用內(nèi)存,但是它只存地址(別人的地址),它存的誰(shuí)的地址我們就稱它為指向誰(shuí)的指針;
int*p=&a;int*p_2=newint(200);先不管他的類型申明,只看變量本身p和p_2。前面講到指針存放的是對(duì)象的地址,那么可以理解為指針是一個(gè)地址變量,那么賦值的話就需要也賦一個(gè)地址給它一個(gè)地址。int*和char*都可以表示地址類型,它們的區(qū)別就是地址所存的值得類型不同,一個(gè)是存整型,一個(gè)是存字符型;
對(duì)指針取值的話,就是用“*”號(hào),后面接對(duì)象地址,也就是指針變量,所以*p和*p_2就分別是a和200;
指針的運(yùn)用指針并不是C/C++獨(dú)有的,像C#和java等其實(shí)也是有指針的,只不過(guò)都被語(yǔ)言本身用其他的方式替代和封裝了一般程序員接觸不到,C/C++就不一樣,它是直接將指針暴露給開發(fā)者,因?yàn)榇蟛糠譅可娴街羔樀亩寂c內(nèi)存有關(guān),而計(jì)算機(jī)內(nèi)存很重要,萬(wàn)一出什么問(wèn)題可能系統(tǒng)都會(huì)崩潰,下面就簡(jiǎn)單來(lái)看一下程序在運(yùn)行時(shí)指針與內(nèi)存之間到底是個(gè)什么樣的關(guān)系:
先看一段代碼:
#include<stdio.h>
#include<string>
#include<iostream>
#include<time.h>
usingnamespacestd;
classpeople
{
public:
people();
~people();
stringName;
intage;
boolsex;
charinfo[1024];
voidrun(){}
voideat(){}
private:
};
people::people()
{
}
people::~people()
{
}
intmain()
{
people*p1=newpeople();
cout<<p1<<endl;
cout<<&p1<<endl;
cout<<sizeof(p1)<<endl;
cout<<sizeof(*p1)<<endl;
system("pause");
return0;
}
直接運(yùn)行看結(jié)果:
分析接下來(lái)來(lái)一一進(jìn)行分析:
首先people*p1=newpeople();這一句是類的一個(gè)實(shí)例化,系統(tǒng)會(huì)給people實(shí)例化一個(gè)對(duì)象*p并且給它在堆上開辟空間,注意是在堆上,開辟的空間用來(lái)存儲(chǔ)對(duì)象的數(shù)據(jù)。數(shù)據(jù)包括哪些?就是對(duì)象的屬性和虛函數(shù)指針,但是函數(shù)并不存儲(chǔ)在各對(duì)象中。因此run()和eat()方法是不存在對(duì)象*p指向的內(nèi)存處的。
cout<<p1<<endl;輸出的是00279360,這是一個(gè)地址,是系統(tǒng)給newpeople()對(duì)象分配的地址。
cout<<&p1<<endl;輸出的是0012FD90,這也是地址,但這是指針變量p本身的地址。
cout<<sizeof(p1)<<endl;
cout<<sizeof(*p1)<<endl;
通過(guò)這兩個(gè)輸出就能有更清晰的認(rèn)識(shí)了,p1本身只占用4個(gè)字節(jié)的空間,而它所指向的對(duì)象的地址所占的空間就很大,等于類中所有數(shù)據(jù)類型所占空間之和。
接下來(lái)在main函數(shù)里寫一點(diǎn)邏輯:
圖解我們來(lái)看一下程序運(yùn)行時(shí)間,指針和內(nèi)存是怎么工作的。這里畫一個(gè)圖給大家:
程序在運(yùn)行時(shí),數(shù)據(jù)主要是存儲(chǔ)在棧、堆、代碼區(qū)、全局區(qū)。代碼區(qū)主要就是存代碼中出現(xiàn)的一些字符常量、方法等,比如這里代碼中給對(duì)象的Name屬性賦的值“xiaoli”之類的都是存在此處,然后我們通過(guò)new出來(lái)的對(duì)象,都是由堆通過(guò)計(jì)算好類中各屬性所需空間然后開辟出來(lái)的。這里p3不是通過(guò)new開辟出來(lái)的,所以他是存在棧上的并且地址是固定的,是不能更改的,而p1和p2是能更改的。
改變地址
如此,我們?nèi)齻€(gè)對(duì)象互相賦值后會(huì)發(fā)生什么呢?
對(duì)比代碼和輸出結(jié)果我們發(fā)現(xiàn)了什么?賦值后p1和p2本身的地址并無(wú)改變,但是他所指向的內(nèi)存都編程p3所在的內(nèi)存了。下面用圖解給大家看一下:
注意,此處原來(lái)的p1和p2指向的內(nèi)存由于是new出來(lái)的我們需要手動(dòng)釋放它。所以我們?cè)谥匦沦x值之前要將這兩塊內(nèi)存刪除掉deletep2;deletep1;
改變地址的值
如果我將代碼中的p2=&p3;換成*p2=p3呢?我們看下輸出結(jié)果:
造成這種情況的原因,其實(shí)這就牽涉到指針的兩種賦值問(wèn)題:一種是改變指向的地址,一種是改變本身指向地址的值p2=&p3是改變指向地址,*p2=p3是改變指向地址的值。
C語(yǔ)言什么叫指針
C語(yǔ)言中內(nèi)存地址叫指針。
指針,是C語(yǔ)言中的一個(gè)重要概念及其特點(diǎn),也是掌握C語(yǔ)言比較困難的部分。指針也就是內(nèi)存地址,指針變量是用來(lái)存放內(nèi)存地址的變量,在同一CPU構(gòu)架下,不同類型的指針變量所占用的存儲(chǔ)單元長(zhǎng)度是相同的,而存放數(shù)據(jù)的變量因數(shù)據(jù)的類型不同,所占用的存儲(chǔ)空間長(zhǎng)度也不同。有了指針以后,不僅可以對(duì)數(shù)據(jù)本身,也可以對(duì)存儲(chǔ)數(shù)據(jù)的變量地址進(jìn)行操作。
指針描述了數(shù)據(jù)在內(nèi)存中的位置,標(biāo)示了一個(gè)占據(jù)存儲(chǔ)空間的實(shí)體,在這一段空間起始位置的相對(duì)距離值。
如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。