在C語言中,指標是怎樣通過形參改變實參的?怎樣理解?如果此處難講清楚,可以讀什麼文章?請指教

2022-10-07 15:22:57 字數 4885 閱讀 4361

1樓:風若遠去何人留

這個要從傳值和傳指標呼叫區別說起.

首先,每個函式的形參,都相當於一個函式的區域性變數.

那麼傳值呼叫時,比如函式 fun(int a);的時候,呼叫fun(b);

相當於新建了一個區域性變數int a=b; 然後 改變a的值自然不會改變b.

而傳指標呼叫,比如 fun(int *p);

這時呼叫fun(q); q是另外一個指標.

那麼等效於 int *p = q;

這時如果改變p的值,也不會影響q,但如果改變*p的值,由於p和q相等,所以*q也會同步改變.

如果改成另一種常見的形式

fun(&a)

那麼*p就是a值,自然會改變的.

2樓:匿名使用者

如果形參是指標,那麼其傳遞的是變數的首地址,那麼在函式中向這個地址賦值,就可以改變指標所指向地址的內容,如:

void get(int *a,int n)

3樓:匿名使用者

《征服c指標》這是一本講c語言指標的書,我看了還是挺不錯了,有很多有趣的想法,讓我恍然大悟,指標還是要靠自己去領悟,別人說永遠都不說不清楚。

在c語言中怎樣使形參值改變實參值也跟著改變

4樓:風若遠去何人留

在c裡面 是無法做到形參改變 實參值同步改變的。

只能通過傳地址的方式

即引數型別為指標

這樣 形參指向空間修改,可以使得實參指向空間同步修改,因為是同一塊記憶體區域。

另外,在c++中,可以通過引用傳參,來實現你說的目的。

5樓:匿名使用者

在c語言中,通過指標傳遞,可以在自定義函式操作其他函式內的變數值。

把實參的地址傳給形參,這樣形參得到地址間接訪問實參本身。

c++裡還可以按引用傳遞,把「實參本身引用過去」可能更好理解,引用內部實現也是指標

6樓:夢想作坊

利用返回值,或者是指標。

c語言中指標作為形參,**如下:

7樓:

你要用*去解引用,這樣才能改變指標指向記憶體的值。

你的swap函式寫的有問題,正確的寫法有人給了。

至於為什麼*x,*y的值沒有改變,因為你交換的是2個形參的值,雖然你傳入的是指標,但是你沒有把它們當成指標來用,最後的結果跟傳非指標值是一樣的。

如果想真正改變實參的值,就必須交換指標指向的記憶體,而不是單純交換指標變數本身。形參是通過堆疊傳遞的,只有用類似 *x = 1;這樣的語句操作指標指向的記憶體,才能影響到實參,否則實參的值是不會改變的。

其實最好的方式就是去vs裡除錯執行,仔細觀察執行過程,就能比較清晰地瞭解指標。單純的理論是站不住腳的,拉出來溜溜就一清二楚了。

想對你能有幫助。

8樓:夢

#include

void swop(int *x, int *y)int main(void)

你的交換函式有問題,首先交換順序就錯了,指標傳遞的是地址,t 要是值,才能將指標指向地址所代表的值進行交換

9樓:匿名使用者

首先,void swop(int *x, int *y)傳進是指標沒錯,但是,引數你可以這樣理解,int* 是型別 x,y 是引數,

所以是傳進swop的還是 x,y (x,y其實是資料所在的地址),亦是說,swop函式裡交換你可以將

x y 地址指向的資料交換(t = *x ;*x=*y;*y=t ),但就不能交換 x,y 本身。

說得不清楚,寫個例子吧

int add(int a,int b) 與int add(int * a, int *b);

這兩者的引數型別是 int 與 int *

既然 第一個int add(int a,int b) 裡的 a b 不能修改,那麼 第二個int add(int * a, int *b)裡的 a b 也肯定不能修改的咯

10樓:小瓜瓜的大店

#include

void swop(int *x, int *y)int main(void)

拿去試試你就知道了,為什麼了,注意觀察記憶體地址的變化swap函式接收的只不過是原先x y中的內容,而這個內容,就是 3,4 的地址,對吧

swap將得到的地址進行交換,swap函式在棧上執行,執行完就銷燬了,不會影響到真正的3 和4,

你再看看這個,傳過去的是x,y的地址,swap就能通過這個x y的地址找到 3 4的地址,這樣就能真正的操作到3 4 了

#include

void swop(int **x, int **y)int main(void)

一樓的解釋更加清楚明白

c語言中當形參是指標,實參是什麼?當實參是指標,形參是什麼?為什麼? 5

11樓:小莫喲

第一個問題:

形參是指標,實參就應該是對應資料型別的地址。

例如:swap(int *x,int *y)int main()

第二個問題:

當實參是指標的時候,形參應該是什麼?

其實很簡單,你只要把

第一問列出來 ①實參:地址 ②形參 :指標一一對應出來 ①實參:

指標 ②形參:指標的指標因為你要在區域性函式中改變實參,就需要傳遞它的地址,指標也是如此,把它類比為int型變數就好了。

個人理解,希望能幫到你,如有不對,歡迎指正

12樓:匿名使用者

形參是指標,實參肯定要接收指標的,,你說是什麼?

int a = 10;

int *p = &a;例如&a的形參,實參就是*p了。等等。。自己舉一反三吧。

c語言中指標怎麼使用?

13樓:圓隨緣滅

1、指標指向變數:

下面有這樣一個**塊:

int  main()

void test(int  x,int y)

最後輸出的結果還是a=10,b=15。

因為在函式呼叫時,實參和形參之間只是值傳遞。

但我們使用指標結果就不一樣了,如:

int  main()

void test(int * x,int *y)

輸出結果a=15,b=10。變數a和b的值發生了交換。

這是因為我們利用指標訪問變數的儲存單元,間接修改變數的值。

2、指標指向陣列:

定義一個陣列並初始化,int array[5]=,定義一個指標變數並把陣列的地址賦給它,int *p=array,注意陣列名就是陣列的地址,而且陣列的地址就是首元素的地址。

因此我們的指標變數就指向了陣列的首元素,*p=2。如果把(p+1),那麼指標變數就指向了陣列的下一個元素5,因此我們可以利用指標來遍歷陣列的各個元素:

int  main()

;int *p =array;for(int i=0;i<5;i++)return 0;}

3、指標指向字串:

我們都知道用陣列儲存字串,如char name[20]="jack",上面已經簡單講述了指標指向陣列,所以我們可以這樣做,char *name="jack",指標變數指向字串的首個字元並可以依次訪問字串的各個字元。

4、指標指向函式:

我們需要知道怎樣表示一個指標指向函式,說白了就是語法要正確,下面我也取一個**塊來說明一下:

int sum(int x,int y)

int main()

不難發現上面**塊里語句(*p)(a,b)可以用p(a,b)來代替,因為p和sum就是一樣的,只是用前者可能更容易理解一點。

而我們要知道怎樣定義一個指標指向函式,int (*p)(int,int)這是固定寫法,前面的int是指標將來指向的函式的返回值的型別,如果沒有函式返回值,那就是void,後面括號裡的兩個int當然就是指標將指向的函式的形參。

5、指標指向結構體:

我們首先首先定義一個結構型別,

struct student

;再根據型別定義結構體變數struct student stu=;

定義一個指標指向結構體型別,struct student *p;把結構體變數stu的地址賦給指標變數p,p=&stu;

我們可以有3種方式來訪問結構體中的屬性ages:stu.ages=15;(*p).ages=15;p->ages=15;不過第三種方式在c語言中只能用來指向結構體。

14樓:匿名使用者

我是這樣理解的:

在c語言中,你需要定義變數,那麼你所定義的這個變數本身你要理解兩層含義:

(1)變數中的值是多少?有了值我們可以直接拿變數參與運算,eg. int a=5;在計算的時候a就表示5;

(2)變數儲存在記憶體中的什麼位置?變數的儲存位置,就是變數的地址,那麼這個地址可以用指標來儲存,eg. int a=5, *p=&a; 在這裡p就是指標變數,儲存了變數a的地址,這個時候你要是用a變數的值,即可以直接用a,也可以用*p,*p是通過p這個指標(也就是a的地址),間接的找到a,在程式中*p與a是等價的。

15樓:匿名使用者

指標是指向地址的,所以你對指標修改也會影響到原地址的值,所以當你需要在函式裡修改函式外的變數時可以考慮指標,當然指標還可以連線結構體裡的節點之類的,後面還有跟函式有關的,只要多揣摩就會了解了

16樓:欣夢魂

指標可以理解為地址即指向地址的指標,在使用之前要明確三個問題,指標的型別,指標指向的型別,指標指向值的記憶體區域。通過傳遞值的地址來傳遞值

17樓:我是張玉柱

就是地址的地址,之後會學到指標型函式就是函式引數是指標型別的,我們平時學的是int ,float等等,還會學到函式指標就是呼叫函式的地址。

在C語言中,當形參和實參都為指標時,在函式中傳遞的是地址嗎

是的,指標這玩意兒,就是專門和地址掛鉤的!這程式是你寫的嗎?要是你寫的話 你就看下面的三段話 就能找出。1.比如你定義一個函式void add int a,int b 這裡的a和b就是形參。2.當你進行函式呼叫的時候,add 1,2 這裡的1和2就是實參。3.形參就是沒有賦值的變數,實參就是有賦值的...

C語言中,用陣列名作形參和用指標作形參有區別嗎

還是有差別的 雖然大多數時候都可以相互用最大的差別就是指標可以改版變,可以通過指標改變指向內權容的值,但陣列名不行 舉個例子 分別作為形參 int num 10 p p num 此時p指向陣列的第一個元素我在主函式裡呼叫兩個函式 1 sum num 2 sum p 2,10 這就有區別了,因為num...

C語言中指標問題 設int a,那麼a的意義是什麼呢

這是一個2級指標,指向int型別的指標的指標。p 就是1級指標,就是一個一維陣列的陣列名,再 才是資料!a 0 是一個記憶體地址,是a 0 這個一維陣列的開始地 址。可能在char型別中使用比較多,char a 3 5 的話,a 0 就是一個字元專陣列的開始地屬址了,可以讀入或輸出。int p 是一...