C語言如果用指標去使用變數,和直接使用變數有什麼不同

2022-03-15 12:17:04 字數 5772 閱讀 7031

1樓:

指標是c語言中的乙個重要概念,也是c語言的乙個重要特色。正確而靈活的運用它,可以有效地表示複雜的資料結構;能動態分配記憶體;方便地使用字串;有效而方便地使用陣列;在呼叫函式時能獲得乙個以上的結果;能直接處理記憶體單元位址等……——《c程式設計(第三版)》

你在舉例的時候說的直接引用資料的時候是幾乎沒有區別的,陣列其實也相當於一種指標的應用,只不過是規定好了的。但比如用在排序上,同樣是排序(從大到小)資料1和2,不用指標:

#include

void main()

}排序完成後,p1指向較大的數2,p2指向較小的數1,而a仍然等於1,b=2,它們的值是不變的。如果在另外的程式中同樣呼叫了這兩個變數,用指標就不會對其產生影響,這就是指標作用的乙個方面。指標還有很多其它方面的作用,這也是c語言的乙個特色,建議你好好地學一下,很有用的。

2樓:一束斜陽

對陣列來說,a[0]和*a具有相同效果,a[0]相當於位址指標,一般來說速度是相對快一些的。因為引用其他變數時也是先找到位址來使用。

用指標來使用變數時,作實參,則修改形參能達到修改實參的作用。直接用變數則不具有此效果。因為指標作實參傳遞的是位址。

3樓:

在編寫大型的程式時,指標帶來很多方便,速度快也是其中的優點,兩個的區別在於前者指向位址後者指向位址所在的函式值。指標引用上建議另外定義乙個指標變數,因為陣列名最好不拿出來使用。。

4樓:

a[0] a[1] a[2]這樣給出下標,陣列名a是陣列第乙個元素的位址,程式通過 a的位址 + 變數型別的大小 * 陣列下標 就是陣列元素的位址。

*a,*(a+1),*(a+2) 是直接給出陣列元素的位址指向的值。

c語言中指標變數與普通變數的區別是什麼?

5樓:與子如初見

int a;

int *p = &a;

指標p是乙個變數,裡面存的是乙個位址,這個位址是a的位址。通過取值運算子*就可以用p訪問a。指標變數使用起來靈活,乙個指標變數只佔四個位元組,但是它可以訪問類似結構體,鍊錶,陣列等多資料集合,而且在訪問這些變數的時候是對記憶體直接訪問,執行效率更高,知識需要慢慢積累,用得多了你就知道指標的好處了。

讓指標指向下乙個很簡單:

比如說int a[10] = ;

int *p = a; //那麼現在p指向的就是陣列a的第0個元素,*p的值就是1

p++;//執行完這句p就指向了陣列a的下乙個元素 ,也就是陣列a的第乙個元素,*p的值就是2.

6樓:殳德候寄雲

1、指標變數是變數的一種,指標變數的值是位址(也是整數),普通變數的值是整數、實數或者其他型別。指標變數的主要作用是修改其他函式的區域性變數和訪問陣列。指標變數需要額外的空間存放位址,由於指標變數是間接訪問所指物件,所以比起直接用普通變數名字訪問所指物件而言,速度稍慢。

2、例如:int

a=5;

int*p

=&a;

指標p是乙個整型指標變數,裡面存的是乙個位址,這個位址是a的位址。通過取值運算子*就可以用p訪問a。指標變數使用起來非常靈活,乙個指標變數只佔四個位元組,但是它可以訪問結構體,鍊錶,陣列等多資料集合,而且在訪問這些變數的時候是對記憶體直接訪問,執行效率高。

c語言 指標變數與普通變數的區別

7樓:怕壯

主要是指標有效率. 比如把 乙個長 1m 的字串發給子函式, 讓它輸出到檔案.這個傳遞過程 你傳指標就比傳字串的效率高百萬倍!!

8樓:緩緩掉落的松針

簡單說就是

指標變數存放普通變數的位址,而普通變數儲存資料。

9樓:匿名使用者

普通變數和指標變數不同就是儲存位址

10樓:匿名使用者

void swap(int *x, int *y)void swap(int x, int y)呼叫一下這兩個引數你就知道有什麼區別了,指標才能真正操作你傳入的實參,而變數只能改變形參

指標指向下乙個就是p+1

11樓:與子如初見

int a;

int *p = &a;

指標p是乙個變數,裡面存的是乙個位址,這個位址是a的位址。通過取值運算子*就可以用p訪問a。指標變數使用起來靈活,乙個指標變數只佔四個位元組,但是它可以訪問類似結構體,鍊錶,陣列等多資料集合,而且在訪問這些變數的時候是對記憶體直接訪問,執行效率更高,知識需要慢慢積累,用得多了你就知道指標的好處了。

讓指標指向下乙個很簡單:

比如說int a[10] = ;

int *p = a; //那麼現在p指向的就是陣列a的第0個元素,*p的值就是1

p++;//執行完這句p就指向了陣列a的下乙個元素 ,也就是陣列a的第乙個元素,*p的值就是2.

12樓:匿名使用者

1、指標變數是變數的一種,指標變數的值是位址(也是整數),普通變數的值是整數、實數或者其他型別。指標變數的主要作用是修改其他函式的區域性變數和訪問陣列。指標變數需要額外的空間存放位址,由於指標變數是間接訪問所指物件,所以比起直接用普通變數名字訪問所指物件而言,速度稍慢。

2、例如:int a=5; int *p = &a;

指標p是乙個整型指標變數,裡面存的是乙個位址,這個位址是a的位址。通過取值運算子*就可以用p訪問a。指標變數使用起來非常靈活,乙個指標變數只佔四個位元組,但是它可以訪問結構體,鍊錶,陣列等多資料集合,而且在訪問這些變數的時候是對記憶體直接訪問,執行效率高。

c語言用指標變數去修改變數的值比變數直接賦值效率高嗎

13樓:匿名使用者

對於你的例子,是否使用指標效率是一樣的,沒有區別。

指標的高效簡潔體現在對複雜物件的操作上,

高效,比如傳遞乙個類,如果使用位址傳遞,實際上只傳遞乙個int大小的位址,而物件傳遞,則需要大量的記憶體空間複製乙個臨時物件。

簡潔,體現在**的靈活上,也不是針對單一的簡單資料型別操作,今後的程式設計中,你經常可以看到類似這樣的語句:while(*p++) **比不使用指標要簡潔。

c語言指標變數和普通變數的區別

14樓:小孫孫的店鋪

指標和普通變數的區別,最簡單的思考應該按整數的兩個不同用法著眼:

整數可以表示序號和數量----數量的概念不必說了,但序號的概念人人都懂但不透徹。

2012表示年----這是序號,它的下一年是2013,即2012+1可得2013,但這裡的1是什麼?是公元1年嗎----是序號還是數量?

2012是今年,2013是明年,兩者能相加嗎?序號+序號是什麼?

指標是什麼?指標是嚴格意義上的序號----儲存位置的編號!

所以指標+數量為指標----成立

反之指標-指標為數量----成立

指標+指標------不成立

c和c++中源**級對儲存資料的訪問有兩種方法:按名字和按指標----就象在大街上按名字(類似變數名)或按門牌號(類似位址)訪問商店一樣。

1、指標變數是變數的一種,指標變數的值是位址(也是整數),普通變數的值是整數、實數或者其他型別。指標變數的主要作用是修改其他函式的區域性變數和訪問陣列。指標變數需要額外的空間存放位址,由於指標變數是間接訪問所指物件,所以比起直接用普通變數名字訪問所指物件而言,速度稍慢。

2、例如:int a=5; int *p = &a;

指標p是乙個整型指標變數,裡面存的是乙個位址,這個位址是a的位址。通過取值運算子*就可以用p訪問a。指標變數使用起來非常靈活,乙個指標變數只佔四個位元組,但是它可以訪問結構體,鍊錶,陣列等多資料集合,而且在訪問這些變數的時候是對記憶體直接訪問,執行效率高。

c語言用指標比較快是不是因為直接訪問尋找變數需要的時間比較多 而指標直接從位址訪問就不用定址費時了?

15樓:mr流星飛逝

可以這麼理解,省去了變數定址的時間。

16樓:匿名使用者

用指標不是減少了定址的時間,是省略了計算位址的步驟,要做的工作少了,所以說速度快。

用指標比較快,這個概念有點過時了。現在的編譯器,**優化的效率是很高的,在設定高優化級別的情況下,兩者幾乎沒有差別。另一方面,使用指標程式設計相對複雜,更容易導致潛在的錯誤,就軟體工程的角度來看,犧牲可靠性來換取速度的小量提公升(甚至速度沒有提公升)是划算的。

結論,減少指標的使用,使用索引就很好。要想提公升執行速度,編譯的時候把優先級別設的高一點就可以了。

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

17樓:百度使用者

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

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

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

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

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

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

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

18樓:匿名使用者

最簡單的情況:

用指標代替結構,陣列等

用指標返回運算後的結果

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

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

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

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

19樓:匿名使用者

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

int b=a //a

和int *b

b=&a //b

指標還是少用吧

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

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

20樓:匿名使用者

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

在c語言裡面宣告指標並用malloc賦值與與直接宣告變數並獲取其指標有何區別?

21樓:

區別當然是有的

link n; 申明結構體實體

&n 結構體位址

link *n; 申明結構體指標

n=malloc(sizeof(link)); 讓結構體指標指向申請的記憶體空間,需要free釋放

後者需要釋放並且申請大小靈活

希望對你有幫助

22樓:戀v天真

首先你得明白malloc函式的作用;malloc函式是在記憶體中找到乙個合適大小的記憶體空間來儲存資料,並讓指標指向這個空間的首位址。它的意義是在建立陣列時,可以建立動態陣列。

比如 int a[n],*p;p=a;是不合法的。而int *p;p=(int *)malloc(n*sizeof(int))卻可以實現建立這樣乙個長度為n的陣列

23樓:百

有區別的。

malloc分配的記憶體是長期的,一直到free,你的指標指向的記憶體才會無效。

但是&n賦值給指標,離開link n所在的函式以後,指標指向的記憶體已經無效了,繼續使用的話會崩潰哦。

100分o(∩_∩)o

C語言如果我定義了指標int p和變數int p,他倆之間有什麼關係嗎

int p int a 1 p a p定義成了bai乙個整du型指zhi針,而a定義成了乙個初始值為1的整型變數。dao指標是用來儲存內對應容型別的變數的位址的,所以p a 的意思是用指標p來儲存變數a的位址。而如果同時定義int p int p 會發生編譯時錯誤,因為p重複定義了。同乙個作用域 內...

c指標變數的問題,C語言指標變數大小的問題

p 1,是把1賦值給p所指向的物件,而p 1是把1賦值給p,這個1是被當做位址的。p 1和p 1是不同的概念,p 1 是賦值語句,還有在c語言中 1 0 是作為真假來用的,就相當於布林型數一樣。這兩個語句都是合法的。區別就是指標 的意思是取位址的意思。p是乙個指標,他的值是記憶體中一塊記憶體的位址,...

c語言字元指標變數,C語言裡為什麼字元指標變數指向的字串常量中的內容是不可取代的?

對於printf這個函式,有著一系列的格式符號 比如你說的 d s不同的格式,有著不同的引數型別要求 比如 s 要求對應引數必須是char 型的 你例子中的string就是這一型別 所以不會出錯 如果換成printf s string string為char 型,對應的格式是 c 而 d對應的是整型...