c語言指標怎麼理解,什麼時候會用到指標,要注意哪些方面

2021-03-22 05:01:34 字數 5529 閱讀 9440

1樓:匿名使用者

cpu自己有運算器和暫存器,通過匯流排與儲存器件相連,在

執行運算時,

需要將資料衝儲存器件上面將參與運算的資料讀入,運算完成後再送出到

儲存區。那麼cpu讀入時需要訪問儲存器件的某個單元,需要指定這個單元

的編號,我們管這個編號叫儲存地址。

比如:int a[10],*p; p=&a[3];a就是一個擁有10個整型資料的資料區

的首地址,變數p是存放地址的,稱為指標型變數,賦值時需要取相應儲存

區的地址,p=&a[3];就是取陣列a的第4個單元的地址給p,那麼p就拿到了

這個單元的地址,*p=5;就相當於a[3]=5;的操作,p++;後p指標就指向a[4]。

在操作大塊資料時,一般記錄首地址(陣列指標),然後根據首地址再加

上偏移量來訪問整個資料,在你程式中寫a[3]時,計算機就會取a陣列對應

的首地址再加3個整型偏移量來訪問相應資料。用指標p訪問a陣列的好處

是,不用每次計算a加多少偏移訪問資料,而是使p指向某資料後可以p++

或p--來訪問前一個或後一個資料。

注意:1.指標存放地址用,不是儲存實際資料的,它是用來找數的,在

程式中要注意這點,往往出問題的是,指標還沒有賦值就用來操作,或

用指標來存放資料,如:int *p=15,s[10]= };的

p指標賦值有問題,這樣計算機會把15當成地址存放到p變數中,以後用

*p訪問得到的資料就不是你想要的資料了。(應該類似:p=s+1; *p=15;)

2.指標訪問資料區一般需要程式來控制不要越界,比如定義了10個單元

的資料區,你不能讓指標超出這10個單元的範圍,否則得到的資料就是

不靠譜的。

3.指標的定義只是開設了可以訪問資料區或陣列的變數,資料區和陣列

需要你的程式另行開設,然後把資料區或陣列的某個單元的地址賦值給

指標變數,不要認定義了能訪問陣列的指標,陣列就定義好了。

4.指標存放的地址最好不要用來與其他地址比較,除非你能確認地址比

較的結果肯定是你想要的。

5.舉例來說,int a[10],*p=a;中a和p都是指標(地址),但a和p是不同的

在編譯器眼中,a是一個資料區的首地址,是一個標記,你程式中使用a

時,編譯器會知道用資料區的首地址來替換操作,而p是你自己程式開

設的變數,可以在程式中操作比如p++; p=a;等,但作為記號的a就不能

在程式中操作了,如a++; a=p;就是錯的了。

6.子程式如果引數是指標型的,這個引數由子程式開設的指標型臨時

變數儲存,這個臨時變數可以進行操作,但不會返回給呼叫者的指標型

變數。如:int a[10],*p; int f(int *s) main()

s再怎麼加減都不會影響p。

2樓:匿名使用者

指標可以理解為一張 寫有變數或函式入口或結構體具體存放位置地址 的紙條,如果把記憶體比作一棟大樓,那麼紙條上寫得就是第幾層樓第幾號室。使用指標的意思就是自己根據紙條上地址,找到對應的房間,並對房間裡面的東西取出來做出你需要的操作。

用到指標的情況很多,最常見的是被呼叫函式返回多個引數時會用到;製作各種連結串列會用到;訪問結構體成員會用到;手動動態分配使用記憶體會用到;一些特定的結構體變數型別會用到(如 file)為提高程式執行效率也會特意使用指標(包含很多種情況,不再贅述);等等等等

要注意的地方也很多,很難說完,常見的就以下幾種(我能想到的):

1.指標變數和普通變數概念使用方式相混淆

2.指標變數的賦值(初始化,傳遞地址)方式有誤3.指標變數的型別與所指元素的型別不一致

4.指標移動不恰當

5.指標在使用過程中發生了不必要的導致錯誤的改變6.多重的指標指向指標,導致形成難以理清的邏輯關係還有很多其他情況,在不同的使用環境下,指標會產生一些特定的要注意的問題;歸根結底是c語言指標太靈活了,能做得事非常多,代價就是產生問題的原因也是很靈活的,一一列舉幾乎是不可能的。

希望對你有所幫助

3樓:匿名使用者

很多地方都可以用到指標,打個比方。就像我們去公共浴室洗澡,買票要給個有編號的鑰匙,看到編號我們就知道要去找這個編號的衣櫃,把衣物放在裡面。洗完澡我們要拿著鑰匙去找櫃子拿衣服。

鑰匙上儲存了編號---------根據編號找到衣櫃---------拿出衣櫃裡的衣服

要注意的是指標要用完釋放,不然容易弄成野指標。還有指標指向的內容。

4樓:匿名使用者

說實話吧,c語言的精髓就是指標,你的這個問題,沒有誰能幫你解決,去看看書吧

推薦 《c和指標》講解的挺詳細,自學的難度是有點大,這是大一的課程,你呢?是、、、

5樓:匿名使用者

個人理解

指標就是地址,不過這個地址是有型別的,比如一個int型的指標,int指的是該指標指向的那塊記憶體存放的內容是一個int型的資料。

或者也可以把指標的型別簡單的看作是這個指標所能管到的記憶體的大小,如一個int型別的指標可以管4個位元組,char型別的可以管1個位元組。

6樓:匿名使用者

就是資料的地址。 通過指標,可以向這個地址寫入資料,或者讀取資料。p是地址, *p就是地址的內容。

7樓:韭花逞味

c語言指標就是記憶體地址。既然是記憶體地址當然可以用它來訪問記憶體。所以當你要對記憶體進行讀、寫或分配、釋放的時候會用到。

甚至可以用函式指標來訪問函式。要注意的東西一時說不全,這個需要自己實踐總結。

c語言中指標的意義是什麼 什麼時候使用

8樓:匿名使用者

c語言中指標儲存的是記憶體地址

9樓:倪興延燕

簡單地說指標就是指向變數和物件的地址。

指標的用途非常廣泛,比如如果你想通過函式改變一個變數的值,就得用指標而不能用值傳遞。還有在很多時候變數,特別是物件的資料量實在太大,程式設計師就會用指標來做形參,只需要傳遞一個地址就行,大大提高了效率。

以上還只是指標的初步應用,隨著你在c語言學習上的逐步深入,你會發現更多的用途的。

在c語言中什麼是指標?指標是幹什麼用的?,有什麼意義?

10樓:仙

寫簡單的程式的話不用指標也行了吧. 比如這裡a是一個地址(編譯後), 為了讀寫這個地址單元裡的東西,可以用p,也可以用一般變數a.

對於指標的便利,我現在能想到的,可能是:

函式a呼叫函式b時,把一個記憶體塊的地址傳遞過去,這樣可以避免按值傳遞時開闢一個棧空間並逐一拷貝記憶體塊裡的值的開銷(c++裡的拷貝建構函式在做這件事),並且a,b函式操作的都是同一個記憶體塊裡的東西,如果這就是目的,那麼傳指標就是很有效率的做法(如果不用指標就可能要用一個全域性的變數了). 用一個指標(函式指標)存放一系列同型別的函式名(入口地址),方便函式呼叫. void*型別指標可以存放任何型別指標.

讓父類型別指標指向任何子類物件可以實現動態繫結. 寫著寫著似乎指標還挺有用,呵呵.

c語言到底什麼時候用指標什麼時候用變數

11樓:百度使用者

1. 需要改變實參的時候, 只能用指標.

2. 傳遞大型結構並且"只讀"其元素的時候,因為大型結構通過值傳遞, 需要拷貝其每個元素, 這樣效率太低.

3. 需要遍歷陣列或頻繁引用其元素時, 這樣效率比使用下標高.

4. 動態分配空間時, 必須使用指標.

5. 傳遞陣列時, 必須使用指標.

6. 函式返回指標時, 比如fopen

這是經驗和技巧的問題, 多寫點**吧:)

12樓:匿名使用者

最簡單的情況:

用指標代替結構,陣列等

用指標返回運算後的結果

舉例:int max(int a, int b, int c);//返回三個數中最大的數,不需要用指標

void swap(int *a, int *b);//交換變數的值,要用指標

void f(char *str);//結構指標或者陣列指標,減少引數傳遞個數

void f(char str[100000]);//這裡要傳整個陣列的100000個數,降低了效率,甚至會有錯誤

13樓:匿名使用者

指標運算是很複雜的,但是又是一門必學的技巧例如:int a=10

int b=a //a

和int *b

b=&a //b

指標還是少用吧

在涉及值的傳遞時,有時候不得不用指標~

實現的方法無所謂的,關鍵是結果~!

14樓:匿名使用者

這個不是一定要怎麼樣怎麼樣的,要看程式設計時對程式設計的演算法的影響哪種更方便些,也與程式設計習慣有關係啊

c語言的指標有什麼優缺點?

15樓:愛夏的你呀

1、指標的優點

是標識一塊記憶體。電腦記憶體上的每一個位元組都具有一個編號,稱為地址(可以簡單理解為指標),任何讀寫記憶體的指令都必須攜帶地址資訊,否則電腦不知道讀寫那塊記憶體。

不管程式是用什麼語言寫的,要執行資料和**必須駐留記憶體,cpu要執行指令必須有一個「指標」程式計數器指向記憶體的**塊,如果某個指令要操作記憶體資料,該指令必須攜帶額外的地址資訊。

2、指標的缺點

指標可以操作任何東西,所以指標很靈活、很強大,但也引入了複雜性。

擴充套件資料

1、指標利用地址,它的值直接指向(points to)存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。

2、輸出一串字元時,只需要知道它的第一個字元的地址,就可以將這個字串輸出,而第一個字元的地址,可以用指標儲存。所以有n個字串時,就可以用n個指標來儲存。

3、為了儲存一個資料在記憶體中的地址,就需要指標變數。因此指標是程式資料在記憶體中的地址,而指標變數是用來儲存這些地址的變數。

16樓:文化廚子

指標是c語言只所以如此成功的重要原因之一,當然任何事物,往往都是一體兩面的,本質上是一體,看上去是兩面,關鍵是要活學活用,沒比較過分的區別優點、缺點。

c語言主要是針對硬體及系統底層程式設計的,在針對硬體及系統底層程式設計中,對資料的靈活性要求較高,換句話說資料的意義需要經常變動,而資料型別決定了資料的意義,指標一個重要作用是實現對資料型別的轉換,比如要將機器碼為0x3f8ccccd表示成浮點數:

#include

int main()

指標這種能改變資料上下文環境的能力是非常有用的, 比如檢測cpu所支援的儲存順序。

#include

char endian(void)

int main()

如果c語言沒有指標,當然可以想出其它的方法,但是遠沒有指標方便。

指標的缺點,可能對於初學者來說 ,往往不容易理解,而且使用指標程式設計經常會出現一些莫名其妙的錯誤,而且在平時使用c語言進行應用程式開發時,好像指標真的不怎麼有用,這些都不是問題,關鍵是看個人學習c語言的用處,做什麼開發,上什麼專案。

c語言為什麼會有指標?c語言為什麼要有指標呢?

指標是c中的精髓,如果沒有,應該說就是一種很平庸的語言,從本質上說,指標體現了von neumann體系結構計算機也就是當今計算機的特徵,記憶體資料按照當前的解釋決定其意義,其指標的運算更是以機器實現的方式展現出來。具體的主要原因大致如下 1 函式的引數傳遞 c語言只有傳值這樣一種方式,在函式體內不...

c語言 怎麼呼叫指標陣列函式,C語言 怎麼呼叫指標陣列函式

1.函式指標的陣列定義方法 返回值型別 指標變數名 number 形參列表 例如 double add double a,double b double sub double a,double b double mul double a,double b double div1 double a,d...

c語言中的指標有什麼意義,C語言中的指標有什麼意義

寫簡單的程式的話不用指標也行了吧.比如這裡a是一個地址 編譯後 為了讀寫這個地址單元裡的東西,可以用p,也可以用一般變數a.對於指標的便利,我現在能想到的,可能是 函式a呼叫函式b時,把一個記憶體塊的地址傳遞過去,這樣可以避免按值傳遞時開闢一個棧空間並逐一拷貝記憶體塊裡的值的開銷 c 裡的拷貝建構函...