c語言指針做參數
① c語言指針的指針做函數參數
定義sort函數時使用的參數是指針,需要注意的是這個指針是指向數組的,數組的名稱其實就是一個指針,所以p可以做sort的參數
② C語言指針變數的賦值和做函數的參數
1、指針變數的賦值,分為定義時賦值(初始化)和單獨賦值,如:
int x ;
int * px=&x ; //定義時賦值,也稱初始化,注意這里的*是跟隨int的,即變數px是int *類型變數! 實際上的賦值語句是px=&x ;
int * py ;
py=&x ; //單獨賦值,將py指向x
*py=10 ; //這里的*,是引用指針中的數據操作符,*跟隨的變數必須是指針類型變數,否則會出錯! *py就是x,這里相當於x=10;
2、指針變數作為函數的參數時,子函數可以通過指針引用實參地址中的數據,達到修改實參地址中的數據。如:
#include <stdio.h>
void func( int a, int b, int *pmax )
{
if ( a>b ) *pmax=a;
else *pmax=b ;
}
void main()
{
int a=2,b=3,max=0;
func(a,b,&max ); //這里將變數max的地址傳遞到子函數,子函數中通過該地址,可以修改max的值,達到子函數結束後,max能帶回運算結果的效果。
printf("max=%d\n", max );
}
③ C語言中指針作為函數參數的問題。
O(∩_∩)O哈哈~。在函數聲明和定義時Fun(int p1,int p2)是不是表示它的參數是兩個int型的整數。Fun(int* p1,int* p2)則使表示它的參數是兩個指針類型的。定義和聲明時的變數只是代替符,其它的運算符號與類型符號加起來才是參數類型。你如果覺得不好理解,那麼在寫的時候就把int 和*放在一起(int*),這就是參數類型。
④ c語言指針變數作函數參數問題
這是因為在C語言中,主調函數到子函數的參數傳遞都只是單向的。為了要把在子函數中的操作效果帶回到主調函數中,就只有利用指針(指向主調函數中的變數),直接把主調函數中變數的值進行修改。
⑤ 在c語言中,指針作為函數參數,形參只能傳遞值,而不能傳遞地址,是怎麼回事
C語言中,函數參數只能傳值。與傳值對應的是傳引用,C語言不支持函數參數傳引用,C++語言才支持。
C++傳引用函數:
void foo(int& a) { a = 3; }
假如a = 2,執行foo(a)後,a = 3。
---
C語言可以模擬傳引用,方法是通過指針來實現:
void foo2(int* ap) { *ap = 3; }
假如a = 2,執行foo2(&a)後,a = 3
foo2(&a)調用本質上仍然是傳值,只不過傳遞的是指針,指針即是地址,地址本質上是一個無符號整數。
如果:
void foo3(int b) { b = 3; }
假如a = 2,執行foo3(a)後,a = 2。這是因為foo3(a)調用過程中,a值傳給形參b,修改b的值與實參a無關。
注意到,foo3(a)與上述foo(a)傳引用的調用是形式一樣的。
既然C語言通過指針可以實現傳引用調用,為什麼C++還要引入引用這個特性呢?這是因為C++引入的很多新特性需藉助引用來實現,比如,拷貝構造函數等等。
⑥ C語言中指針變數作為函數參數和一般變數作為函數參數的區別
一般變數作為形參,是不能改變實參值的哦,要返回數據就用return;
指針指向真實的地址,不重新分配內存,所以調用函數後,如果函數里改變了指針指向的值,那這個數就真的變了。
調用就是用函數名,還要傳送相應的調用參數。
⑦ C語言指針作為函數參數
#include<stdio.h>
int*fmax(int*,int*);/*函數的聲明和下面的定義參數類型不一致,應該改成指針類型*/
voidmain()
{
intx,y;int*c,*d;
int*pmax;
scanf("%d%d",&x,&y);
c=&x;
d=&y;
pmax=fmax(c,d);
printf("max=%d ",*pmax);
printf("max=%d ",*pmax);
}
int*fmax(int*a,int*b)
{
int*p;
p=*a>*b?a:b;
returnp;
}
⑧ c語言中用指針變數做函數參數有什麼意義
看你的需要了,有時不用指針作為參數達不到你要的效果,比如一個swap()函數。
int
swap(int
a,int
b)
{
int
tmp;
tmp=a;
a=b;
b=tmp;
}
如果你想調用該函數交換兩個變數的值,在主函數中輸出,那是不可能的。比如這樣調用:
int
x=1,y=2;
swap(x,y);
printf("%d
%d",x,y);
你認為會輸出2
1嗎?錯!還是會輸出1
2的。因為傳入swap()函數的只是x,y的拷貝,而不是它們自身。
如果要真正達到交換的目的,就要用指針傳值。這樣定義函數:
void
swap(int
*a,int
*b)
{
int
tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
但是給函數傳值時要注意,指針是指向地址的,所以參數要是地址,即需要給變數取地址。
int
x=1,y=2;
swap(&x,&y);
printf("%d
%d",x,y);
這樣就是輸出2
1了!
⑨ C語言用指針作函數參數
選D
因為第一個參數是地址傳遞,fun(&b,a);中傳入a字元。*c=*c+1將c的值變為b字元。主函數的值改變。
第二個參數是值傳遞,所以在函數中d的值為B字元。但是並不影響主函數的值,所以主函數輸出a的值是A。b的值是b。
⑩ c語言中指針作函數的參數是怎麼回事有點不懂!!!
如果使用指針作為參數就是地址傳遞,否則只是值傳遞。你可以看下下面的這個函數:
void modify(int a)
{
a++;
}
void main()
{
int a=5;
modify(a);
printf("%d",a);
}
這個程序的答案還是5。為什麼?
因為當調用modify(a)時,在執行modify函數時,是另外開辟了一個內存空間,將main中a的值復制過來,modify函數中所有的操作都是相對於這個新開辟的內存空間而言的,對原來的a沒有任何改變。
現在就來說說指針,如果用指針傳參的話那就完全不一樣了,指針(pointer),說白了即是指向變數內存地址。同樣上面的例子:
void modify(int * a)
{
(*a)++;
}
void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
這個答案當然是6
因為你傳進去的是a的地址,所以在modify函數中的操作都是對a地址上的內容進行操作,即是操作a所以modify函數不用返回這個數,main中a的值也會改變。因為大家都是操作同一個內存空間,而上面不用指針,modify操作的是另一個新開辟的內存空間,只是這個內存空間初始值和a一樣。
你在子函數中要對你的主調用函數中變數進行操作時也可以用指針做參數,這樣子函數就可以不用return 如果不是用指針的話,就要再子函數的未尾加上一條return x;把這個數返回當返回值。