當前位置:首頁 » 編程語言 » c語言返回參數數量不確定
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言返回參數數量不確定

發布時間: 2022-04-23 19:51:26

1. c語言選擇題,求大神幫忙解答,為什麼輸出結果不確定請給出具體解析。

fun(2,3,c);中的c是函數fun中的局部變數,與int c;中的c不是同一個變數,當fun函數結束後,fun(2,3,c);中的c將會被編譯器銷毀,後面的printf語句其實是輸出的int c;中的c的值,而語句int c;是聲明了int型變數,但是沒有給它賦值,所以它的值是不確定的(垃圾值)

2. 急!請高手指教c++如何定義一個參數個數不確定的函數

VA_LIST是在C語言中解決變參問題的一組宏,所在頭文件:#include <stdarg.h>,用於獲取不確定個數的參數。

VA_LIST的用法:

  1. 首先在函數里定義一具VA_LIST型的變數,這個變數是指向參數的指針;

  2. 然後用VA_START宏初始化剛定義的VA_LIST變數;

  3. 然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);

  4. 最後用VA_END宏結束可變參數的獲取。


以下是一個定義一個參數個數不確定的函數的簡單例子:

#include<cstdarg>
#include<iostream>
usingnamespacestd;
doubleaverage(intnum,...)
{
va_listarguments;//
doublesum=0;
va_start(arguments,num);//
for(intx=0;x<num;x++)//Loopuntilallnumbersareadded
sum+=va_arg(arguments,double);//.
va_end(arguments);//Cleansupthelist
returnsum/num;//Returnssomenumber(typecastpreventstruncation)
}
intmain()
{
cout<<average(3,12.2,22.3,4.5)<<endl;
cout<<average(5,3.3,2.2,1.1,5.5,3.3)<<endl;
}

3. C語言輸出不確定值為什麼

你把a[j]=j[i]+1;改成a[j]=a[i]+1;
把printf("%d\n",a[2]);改成printf("%d\n",a[1]);就行了
越界了。你定義的int a[2];它的下標是從0開始的,即只有a[0],a[1],沒有a[2],你最後的輸出出錯了

4. c語言中的空函數返回一個不確定的值的意思是返回的數據的數據類型不確定還是返回的數據沒有確定的值

返回的數據是個不確定的值,原因是:
1、你定義函數fun()前面加void或者不加時,默認是無返回值,或者也說返回了一個垃圾數據
2、而這個垃圾數據通常都是固定的一串整形的數據,因為這是編譯器編譯時釋放函數沒有返回值,所以系統隨機返回的一個垃圾值,而往往你輸出驗證時就是差不多大小一個整形數據。
3、也有人理解無返回值,這只是一種理解和解釋編譯器規則的想法。
如果滿意,請採納!

5. 用匯編解釋C語言中printf的參數為什麼是不確定的,如何實現的

//32 bit 匯編調用printf
//call printf (fmt,a1,a1,a3,a4.....an)
;調用的數據壓入棧,由於寬度不知道,所以用偽代碼表示.
push a5
push a4
push a3
push a2
push a1
push offset fmt
call printf
sub esp,sizeof(an)+..........+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)

printf 的C實現
//實際上 用匯編的時候,跳過返回地址就是所有參數的首地址
//mov ebx ,DWORD PTR esp[8] ; //fmt 的地址
//mov esi, DOWRD ptr esp[12] //a1的地址

char**pVarList= &fmt;//fmt 在堆棧最低端。是個地址,所以他的地址就是所有參數的首地址
pVarList++;
for( i=0;i<strlen(fmt);i++)
{
if(*p='%'){
split(&p,w0,w1,s,f)
//p格式的下一個字元,s所代表w0,w1 %8.2f w0=8w1=2 +號-號, case 'U','u'里的 『U』,'u'
switch(f)
{
case 'U','u':如果 是%8U %u %-8 U f=U
unsigned int *pU=(unsigned int*)pVarList;
putUint(*pU,w0,s);所代表 +號-號
pU++;
pVarList=pU;
break;
case 'F','f':....
.{
unsigned int *pF=(unsigned int*)pVarList;
putFloat(*pF,w0,w1,s);
pU++;
pVarList=pF;
}
break;
case ......
break;
}
}
else if(*p=='\')
dealbackslash(&p);//同樣 p指向\格式的最後一個字元的

else putc(*p++);
}

//32 bit
//call printf (fmt,a1,a1,a3,a4,a5)
push a5
push a4
push a3

push a2

push a1

push offset fmt
call printf

sub esp,sizeof(a5)+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)
//16bit
//call printf (fmt,a1,a1,a3,a4,a5)
push a5
push a4
push a3
push a2
push a1
push offset fmt
call printf
sub sp,sizeof(a5)+sizeof(a4)+sizeof(a3)+sizeof(a2)+sizeof(a1)

6. c語言函數定義時,可變參數類型已定,個數不定,應該怎麼做

這個錯誤是你聲明的某些變數佔用空間太大,沒可用的空間,就會佔用操作系統內存空間,建議你別聲明三維數組

7. C語言中如何將結構體作為參數,結構體的數量不確定

如果你能計算數量,可以這樣
fun(struct S * array, int count)
如果不能,則需要在array最後放一個空指針

8. c語言一個函數返回多個值

在C語言中,一般情況下函數的返回值是通過函數中的return語句來實現的,每調用一次return語句只能從函數中返回一個值。但在實際很多應用中,我們需要從函數中返回多個值,那我們可以用什麼方法實現呢?此時我們可以用三種方法來實現。
方法一:設置全局變數
全局變數是在函數外部定義的全局變數,它不屬於任何一個函數,其作用域是從變數的定義處開始,到本程序文件的結尾。在此作用域內,全局變數可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變數來處理。因為根據全局變數的特點,在被調用函數中改變了多個全局變數和值,相當於其主調函數全局變數的值也發生了變化,也就相當於返回了多個值。
例如:利用一個函數求出正方形的周長和面積。
#include
double l=0;//定義全局變數l為正方形周長
void f(double a)//定義求面積和周長的函數
{ double s; s=a*a;//求面積
l=6*a;//求周長,並賦給全局變數l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(「請輸入邊長:");
scanf("%f",&a);
area=f(a);//面積的值通過調用f函數返回值
printf(「面積為:%5.2lf\n」,area);
printf(「周長為:%5.2lf\n」,l);//周長即為全局變數l在f函數中改變後的值
}

上面的例子即用全局變數實現了函數中返回多值的情況,這種方式易懂。但是全局變數用多了會破壞代碼的安全性,結構性,這主要是全局變數在所有函數中都可以使用,從而其值的變化不確定,所以我們要慎用。

方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的著地址,把數組名或者指針作為函數形參,實際上相當於主調函數的實參與形參共用地址,所以在函數中的數組元素發生改變即是實參也隨之改變。也相當於在調用函數時多個值返回給主調函數。

實例2:編寫函數求一維整形數組的最大值與最小值,並把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然後把數組的最大值與數組的第一個元素交換,把數組的最小值與最後一個元素交換。函數被調用完畢後,實參數組中的第一元素為數組的最大值,實參數組中最後一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數組最大值最小值的函數,傳遞數組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用於交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值與最後一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6

注意:該方法適用於多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法。

方法三:使用結構體指針作為函數的形參

編寫返回多個值的C語言函數,可以考慮採用結構體的方式去實現。如果返回的數個數值的數據類型不一致,可以通過定義全局變數實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然後同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那麼函數中對形參結構體的修改即是對實參結構體的修改,函數被調用後獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),並返回這些基本信息給主調函數。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數中傳遞該結構體的指針,則自定義函數中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定義學生結構體類型變數*/
void xxxx(struct inf *ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開:\n") ;
xxxx(&a1);/*調用函數,以學生結構體類型變數地址作為實參*/
printf("學號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數實現對結構體成員數據的錄入操作*/
{
char xh1[12],name1[20],class1[15];
int chj1;
scanf("%s%s%s%d",xh1,name1,class1,&chj1);
strcpy(ptr->xh,xh1);
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
調試結果如下:
請輸入學號,姓名,班別,總評成績,以空格隔開:
200102LiLi200185
學號:200102,姓名: LiLi,班別:2001,總評成績:85
注意:當函數要求返回的多個值是相互聯系的或者返回的多個值數據類型不一致時可以採用該方法。

結束語

對於以上這三種方法,如果想要返回的數個值數據類型一致,可以考慮採用方法2;而對於不同數據類型的返回值,如果各個數值之間是相互聯系的,則方法3較為合適;方法1雖然在很多情況下都可以實現多個返回值的C語言函數,但畢竟全局變數應用過程中有很多危險,要慎重使用。
通過對以上幾種方法的分析講解,在教學過程中,學生再遇到這樣的問題時,就能根據返回值的情況選擇合適的途徑去實現多個返回值的C語言函數。另外,如果再遇到類似的無法用教材知識點去直接解決的問題時,他們基本都能舉一反三地嘗試採用間接方式去解決。

參考材料:http://blog.csdn.net/supreme42/article/details/7636475
http://wenku..com/link?url=

9. 在C語言中,若調用一個函數,且此函數沒有return值,該函數返回一個不確定的值,這句話對嗎

對的,C語言中函數句柄(指針)指向一個地址,如果該函數沒有Return,那麼函數句柄就沒有被賦值,會返回句柄指向內存的值,表現出一個隨機的數。

10. 請問c語言編寫函數時不確定 參數數量時該怎麼辦

在函數定義的時候就必須寫形參名了。聲明的時候不需要,因為編譯器還用不到,只要知道相應位置是個啥類型的就行了