新聞中心
C語言指針變量的賦值和做函數(shù)的參數(shù)
1、指針變量的賦值,分為定義時賦值(初始化)和單獨賦值,如:
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),樺甸企業(yè)網(wǎng)站建設(shè),樺甸品牌網(wǎng)站建設(shè),網(wǎng)站定制,樺甸網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,樺甸網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
int x ;
int * px=x ; //定義時賦值,也稱初始化,注意這里的*是跟隨int的,即變量px是int *類型變量! 實際上的賦值語句是px=x ;
int * py ;
py=x ; //單獨賦值,將py指向x
*py=10 ; //這里的*,是引用指針中的數(shù)據(jù)操作符,*跟隨的變量必須是指針類型變量,否則會出錯! *py就是x,這里相當(dāng)于x=10;
2、指針變量作為函數(shù)的參數(shù)時,子函數(shù)可以通過指針引用實參地址中的數(shù)據(jù),達到修改實參地址中的數(shù)據(jù)。如:
#include stdio.h
void func( int a, int b, int *pmax )
{
if ( ab ) *pmax=a;
else *pmax=b ;
}
void main()
{
int a=2,b=3,max=0;
func(a,b,max ); //這里將變量max的地址傳遞到子函數(shù),子函數(shù)中通過該地址,可以修改max的值,達到子函數(shù)結(jié)束后,max能帶回運算結(jié)果的效果。
printf("max=%d\n", max );
}
c語言中函數(shù)可否改變參數(shù)值
#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
x);
printf("y
=
%d
at
[%x]n",
y,
y);
printf("z
=
%d
at
[%x]n",
z,
z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
運行結(jié)果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數(shù)參數(shù)入棧順序的確是從右至左的??傻降诪槭裁茨兀坎榱艘恢毙┪墨I得知,參數(shù)入棧順序是和具體編譯器實現(xiàn)相關(guān)的。比如,pascal語言中參數(shù)就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual
c++.即然兩種方式都可以,為什么c語言要選擇從右至左呢?
進一步發(fā)現(xiàn),pascal語言不支持可變長參數(shù),而c語言支持這種特色,正是這個原因使得c語言函數(shù)參數(shù)入棧順序為從右至左。具體原因為:c方式參數(shù)入棧順序(從右至左)的好處就是可以動態(tài)變化參數(shù)個數(shù)。通過棧堆分析可知,自左向右的入棧方式,最前面的參數(shù)被壓在棧底。除非知道參數(shù)個數(shù),否則是無法通過棧指針的相對位移求得最左邊的參數(shù)。這樣就變成了左邊參數(shù)的個數(shù)不確定,正好和動態(tài)參數(shù)個數(shù)的方向相反。
因此,c語言函數(shù)參數(shù)采用自右向左的入棧順序,主要原因是為了支持可變長參數(shù)形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,采用自左向右的參數(shù)入棧方式
c語言中指針函數(shù)可以改變實參的值嗎
c語言中形參與實參的關(guān)系是:形參是實參的值副本。無論參數(shù)的類型是什么,傳遞到子函數(shù)中的形參只是實參的值。所以,在改變形參變量自身的值時,是與實參無關(guān)的。換句話說,形參的改變不會影響到實參。
但,如果參數(shù)類型是指針類型,則可以通過對指針變量所指向的地址中的數(shù)據(jù)進行修改,達到改變實參地址中的數(shù)據(jù)目的。
因此,使用swap函數(shù)進行數(shù)據(jù)交換時,必須保證兩點:
1.
參數(shù)必須是指針類型,指向待交換的數(shù)據(jù)
2.
交換時,必須交換地址中的數(shù)據(jù),而不是交換地址本身。
參考代碼:
//錯誤的交換代碼1
void swap1( int a, int b ) //參數(shù)不是待交換數(shù)據(jù)的指針
{
int t=a;
a=b;
b=t;
}
//錯誤的交換代碼2
void swap2( int *a, int *b )
{
int *t=a;//交換形參變量本身
a=b;
b=t;
}
//正確的交換代碼
void swap( int *a, int *b )
{
int t=*a;//交換形參變量地址中的數(shù)據(jù),指針變量不變
*a=*b;
*b=t;
}
C語言如何在可變參數(shù)函數(shù)中使用printf?
如@psxf91所答,應(yīng)使用v*系列的函數(shù)來實現(xiàn)。對比下printf與vprintf函數(shù)原型:
void?printf(const?char?*format,?...);
void?vprintf(const?char?*format,?va_list?ap);
可以看出二者的差別。vprintf才接收va_list類型,printf接收的是不定參數(shù)。
因此,要實現(xiàn)你的要求代碼如下:
#include?"stdarg.h"
void?fun(const?char?*fmt,?...){
va_list?ap;
va_start(ap,?fmt);
//?...
vprintf(fmt,?ap);
//?...
va_end(ap);
}
c語言如何封裝一個帶有可變參數(shù)的方法?
需要借用C語言的VA_LIST?宏定義,及相關(guān)操作來實現(xiàn)可變參數(shù)。
VA_LIST?所在頭文件:#include stdarg.h,用法如下:
(1)首先在函數(shù)里定義一具VA_LIST型的變量,這個變量是指向參數(shù)的指針;
(2)然后用VA_START宏初始化剛定義的VA_LIST變量;
(3)然后用VA_ARG返回可變的參數(shù),VA_ARG的第二個參數(shù)是你要返回的參數(shù)的類型(如果函數(shù)有多個可變參數(shù)的,依次調(diào)用VA_ARG獲取各個參數(shù));
(4)最后用VA_END宏結(jié)束可變參數(shù)的獲取。
以下是一個自定義打印接口的實現(xiàn):
int?my_printf(const?char?*fmt,?...)//...表示參數(shù)可變
{
va_list?args;//定義va_list
static?char?gc_PrintfOutBuff[1000];
va_start(args,?fmt);//初始化
vsnprintf((char?*)?gc_PrintfOutBuff,?1000,?(char?*)?fmt,?args);//這里沒有使用VA_ARG取回單個變量,而是借用vsnprinf一次性讀取。
va_end(args);//結(jié)束獲取
puts("%s",(const?char?*)gc_PrintfOutBuff);//使用。
return?0;
}
分享名稱:c語言函數(shù)指針可變參數(shù) c 可變參數(shù)函數(shù)
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/dodppec.html