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

2021-03-22 05:01:34 字數 5518 閱讀 5621

1樓:百度使用者

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

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

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

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

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

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

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

2樓:匿名使用者

最簡單的情況:

用指標代替結構,陣列等

用指標返回運算後的結果

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

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

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

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

3樓:匿名使用者

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

int b=a //a

和int *b

b=&a //b

指標還是少用吧

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

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

4樓:匿名使用者

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

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

5樓:匿名使用者

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

6樓:倪興延燕

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

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

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

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

7樓:匿名使用者

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。

8樓:匿名使用者

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

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

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

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

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

4.指標移動不恰當

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

希望對你有所幫助

9樓:匿名使用者

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

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

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

10樓:匿名使用者

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

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

11樓:匿名使用者

個人理解

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

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

12樓:匿名使用者

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

13樓:韭花逞味

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

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

c語言什麼時候使用陣列,什麼時候使用指標?

14樓:

任何時候都可以使用陣列,使用指標。

定義時,通常只有字元指標,和字元陣列指標直接定義。用來表示字串或字串陣列。

其他一般定義陣列。操作時用指標或陣列。

其他指標,多半用在引數傳遞,資料結構內部(不確定需要記憶體的大小,或者連結串列,二叉樹等鏈式結構)的時候。

還有一種是有些函式引數就是指標,這時定義一個指標,來操作傳進來的指標引數比較好。

指標作為引數,有一下幾種用法,

1)當作陣列用,用來獲取或設定陣列元素。

2)把一個比較長的資料結構傳入函式,只需要一個指標就夠了。

3)傳入變數的地址,用來讀取或修改變數的值,主要是為了修改用。

直接定義一個不指向任何物件的指標,並且也從不給他賦值,沒什麼意義;

指標要麼指向陣列,要麼指向變數,要麼動態申請記憶體。

null指標,只是一個方便的指標,表示不指向任何物件。

真正有用的還是指向具體物件的指標。

如果定義了一個指標,使用時要讓他指向一個具體物件,當需要他不指向什麼物件的時候,給他賦值為null;

ps:c語言,陣列名只是一個指標常量而已,離開定義可見處,陣列大小的資訊就不存在了。

只有定義完全可見的地方,才可以獲得陣列的大小。

陣列作為函式的引數,和外部引用宣告都不能獲得陣列的大小。

引數只能傳遞指標,引數的大小隻是指標的大小;

只能看到宣告的地方,獲取陣列大小的努力,只能換來錯誤。

void fun1(int a[10]) //<==> void fun1(int a) <==>void fun1(int *a)

void fun2(int [10][10])// <==>void fun2(int a[10])<==> void fun2(int (*a)[10])

15樓:匿名使用者

陣列指標--指向陣列的指標,是一個指標,其指向的型別是陣列;指標陣列--元素為指標的陣列,是一個陣列,其中的元素為指標。仔細研讀下面的程式:

#include

intmain(void)

,};int (* p)[2];

char * s[2] = ;

p = a;

printf("%d, %d, %d, %d\n", (*p)[0], (*p)[1], (*(p+1))[0], (*(p+1))[1]);

printf("%s %s\n", s[0], s[1]);

return 0;}

16樓:匿名使用者

個人認為,當你需要某一變數需要一直存在的話,那麼程式初始化時就可以直接使用陣列之類的;

而當你需要對已存在於記憶體的某些量做改變時,則適宜使用指標。

這裡需要注意的是,使用陣列的前提是記憶體靜態分配,其大小是不可改變的;所以若要求動態分配的話,還是需要使用指標的。希望對你有所幫助。

17樓:匿名使用者

陣列是定長的,你申明多長就是多長,它的記憶體空間是靜態的,定義時就已分配,以後不會變;

指標是不定長的,你用多少就是多少,它的記憶體是動態的,用的時候才分配。

c語言什麼時候使用陣列什麼時候使用指標

任何時候都可以使用陣列,使用指標。定義時,通常只有字元指標,和字元陣列指標直接定義。用來表示字串或字串陣列。其他一般定義陣列。操作時用指標或陣列。其他指標,多半用在引數傳遞,資料結構內部 不確定需要記憶體的大小,或者連結串列,二叉樹等鏈式結構 的時候。還有一種是有些函式引數就是指標,這時定義一個指標...

c語言指標什麼時候加星號什麼時候不加

1 宣告及定義一個指標時,需要用 表示識別符號是一個指標。比如int p 定義一個內指標,p是int 型別,這裡的容 主要說明變數是指標型別。2 作為間接訪問運算子 int a 2 int p a printf d n p,p 以上面的例子來說 p 是指標,是一個地址,它是int 型別。p 是指標所...

c語言中,函式的形參什麼時候必須是指標

當你需要改變傳遞進來的引數的數值時 要傳給指標 情況1 需要復讀入的數制據是比較大的資料,使用指標作為引數可以節省堆疊 比如 定義1個結構體 typedef struct test test ts void func1 test ts t1 void func2 test ts t1 上面2個函式功...