⑴ c語言中為什麼要用到指針呢
很多情況可以用到。這需要在編程過程中形成一種思維。
如 將一個結構體傳遞給一個函數。
如果不用指針,傳送速度慢,如果通過指針,只要傳遞一個地址。
struct example
{
int i;
int j;
int f;
char a[1024];
};
void main()
{
struct example ex;
fun(&ex);//將結構體ex的地址傳遞給函數fun
}
fun(struct example *p)
{
}
⑵ 為啥c語言要有指針
C語言沒有像高級語言那樣的引用類型,所以,在使用參數時,往往只能通過復制參數值來傳遞,即所謂的值傳遞,但是這樣就造成了內存的浪費等諸多原因,指針為C語言提供了一種可以使用地址傳遞值的方法,在運行過程中,操作的將是原始的數據,而不是數據的拷貝。
⑶ C語言的指針有什麼用
C裡面函數都只能返回一個值,如果你的函數要返回兩個值,那就要用指針了,把變數地址傳進函數,然後把希望通過函數操作後想要的值存進傳進來的變數地址裡面。當然函數可以返回數組,結構體,但是你看多了你就知道,沒有人會這么做的,都返回指針。試想如果我有一個1萬個元素的數組,你會把它整個地傳進一個函數裡面或者整個地返回出來嗎?C語言裡面都是傳值的,就是說傳進函數的參數值首先被復制一邊賦值給形式參數,你想想1萬個元素,夠嗆咯!但是有指針就好多了,我們可以把指針(數組的第一個元素的地址)傳進函數裡面,有了開始地址,函數就知道東西在哪兒,就直接去那兒操作就可以了。單憑這一點,你就可以知道指針的威力,當然你也知道了指針一個很大的用處就是用於函數之間參數的傳遞與返回。指針就相當於一個代理一樣,通過代理你知道了你要的東西在哪兒,你去那個地方就可以了,而不是需要把東西整個地板到你面前。
⑷ C語言中為什麼要使用指針訪問數組元素
用指針有一些好處:可以再指針上直接進行計算
比如加減指針。
另外當數組作為
參數傳遞
到函數中的時候,用指針是很方便的。
其實數組的名字就是一個指針。
有一本經典的書
《
C專家編程
》
可以幫助理解這個問題。這種基礎問題是非常重要的。
⑸ 關於C語言,指針在編寫和程序中有什麼用處為什麼要使用指針
這個問題太泛泛了, 說深了連編譯技術和匯編的知識都牽扯到了, 你把書上的相關內容認真讀幾便, 不是很難, 但是需要自己去理解。 先把最經典的函數傳值交換的例子看懂了。就是那個
void swap(int a, int b) 和 void swap(int * a, int * b)
⑹ c語言為什麼會出現指針
因為要有鏈表,有鏈表才能動態存儲,否則只能線性存儲,有時不利於內存充分利用和存取效率。
但也不要被指針限制思維,你要是能想出不用指針又能高效的的更好的解決方法,那你也可以自創一種語言。語言只是形式,關鍵是其背後的邏輯。
⑺ C語言 寫一個函數交換兩個數的值,為什麼一定要用指針
運用代碼解釋指針運用的理解如下:
#include<iostream>
using namespace std;
int fun1 (int a,int b)
{
int c;
c=a;a=b;b=c;
cout<<"a1:"<<a<<";b1:"<<b<<endl;
}
int fun2 (int *a,int *b)
{
int *c;
c=a;a=b;b=c;
cout<<"a2:"<<*a<<";b2:"<<*b<<endl;
}
int fun3(int *a,int *b)
{
int *c;
c=*a;*a=*b;*b=c;
cout<<"a3:"<<*a<<";b3:"<<*b<<endl;
}
int fun4 (int *a,int *b)
{
int c;
c=*a;*a=*b;*b=c;
cout<<"a4:"<<*a<<";b4:"<<*b<<endl;
}
int fun5 (int &a,int &b)
{
int c;
c=a;a=b;b=c;
cout<<"a5:"<<a<<";b5:"<<b<<endl;
}
int main()
{
int aa=1,bb=2;
fun1(aa,bb);
cout<<"aa1:"<<aa<<";bb1:"<<bb<<endl;
fun2(&aa,&bb);
cout<<"aa2:"<<aa<<";bb2:"<<bb<<endl;
fun3(&aa,&bb);
cout<<"aa3:"<<aa<<";bb3:"<<bb<<endl;
fun4(&aa,&bb);
cout<<"aa4:"<<aa<<";bb4:"<<bb<<endl;
aa=1,bb=2;
fun5(aa,bb);
cout<<"aa5:"<<aa<<";bb5:"<<bb<<endl;
return 0;
}
輸出結果為:
a1:2;b1:1
aa1:1;bb1:2
a2:2;b2:1
aa2:1;bb2:2
aa3:1;bb3:2
a4:2;b4:1
aa4:2;bb4:1
a5:2;b5:1
aa5:2;bb5:1
main中調用fun1()時,將實參a,b的值傳遞給了交換函數,如果此時在swap1中列印,可以看到結果是正確的,但是該過程其實是將aa和bb分別復制了一份給了函數,執行完fun1()之後,aa和bb的值沒有任何變化。
fun2(),看似的確使用了指針,但還是失敗,因為這里是將aa和bb的地址給交換了,而並沒有交換aa和bb的值。在這里由於未給c賦值,c中並沒有確定的值,c中的值是不可預見的。此時c可能指向一個未知的存儲單元。
而嚴重的情況是,該單元的數據可能是有用的,因此fun2()不但沒有實現兩個數的交換,反而給系統的穩定性帶來威脅。
fun3(),將int賦值給int *,編譯錯誤。
fun4()是正確的。為了在函數中改變了的變數能被其它函數調用,正確的辦法是用指針變數作為函數參數,在函數執行過程中使指針變數所指向的變數值發生變化。
函數調用結束後,哲別變數值的變化依然保留下來,這樣就實現了通過函數調用是變數的值發生變化,在其它函數中可以使用這些改變了的值的目的。
fun5()也是正確的,這是引用的重要應用之一。對於引用的操作實際上是作用在引用所因的對象上。
(7)c語言中為什麼要用到指針法擴展閱讀
在函數中的參數,並不是調用者的變數,而是臨時申請的變數a和b存放main函數中變數a和b的值,並在函數中用來計算,在fun中給a和b賦值都是在操作這兩個臨時申請的變數,函數返回後,這兩個變數被舍棄,函數調用也沒有將這兩個臨時變數的值返回給main函數中調用使用的參數功能。
所以,在函數中要操作調用者申請的變數,需要給出它們的指針,函數中用指針來找到這些變數的位置和內容。