c語言動態參數
⑴ 如何在c語言的程序中將動態分配的二維數組當做一個參數傳入某個函數
我不明白,如果兩個維度都不是事先確定,你上面要怎麼定義?
arr[][4];
好吧,如果你說的那個可行
那就傳那兩個維度進去。
前面arr[i][j]
那麼就void func(int i,int j,int num)
我不敢保證在func裡面使用到arr[][]的時候貌似能直接使用arr[i][j],我記得這樣用會出錯。
所以你要運算那個地址。
你想要的比如是5行4列的 arr[5][4]
你要第第二行第二個數
那麼就要*(arr+(2-1)*4+2),這樣來得到數字
如果你事先就知道這個維度的話,
直接設定個全局變數
然後連數組都不用傳進去就可以直接運算的。
數組是記錄地址的,會直接修改在原來的地方
⑵ C語言 動態二維數組能否做函數參數
二級指針用的沒有錯,但是這兩部分要換換位置
for(t=0;t<m;t++)
a[t]=(float *)malloc(m*sizeof(float));
if(*a==NULL)
{
printf("out of menory,press any key to....");
exit(0);
}
應該先檢查申請二級指針內存成功與否再使用,而且應該是if(a==NULL),而不是if(*a==NULL)
void search_1(float *p1,int n,int m)
這個函數是想查找在這個方陣中的最大值吧?那麼應該這樣:
void search_1(float **p1,int n,int m)
裡面怎麼實現,你應該會的,你用二級指針很熟練的,理解很正確
⑶ c語言中函數可否改變參數值
#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;
}
運行結果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual
c++.即然兩種方式都可以,為什麼c語言要選擇從右至左呢?
進一步發現,pascal語言不支持可變長參數,而c語言支持這種特色,正是這個原因使得c語言函數參數入棧順序為從右至左。具體原因為:c方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。
因此,c語言函數參數採用自右向左的入棧順序,主要原因是為了支持可變長參數形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,採用自左向右的參數入棧方式
⑷ C語言在A函數內部定義動態指針,如何通過形參實參傳遞到B函數進行分配
你要修改a,就要傳遞a的地址給allocate, 如下
voidmain()
{
voidallocate(int**a);//函數參數是指向指針的指針
int*a;
allocate(&a);//傳遞a的地址
free(a);
}
voidallocate(int**a)
{
*a=(int*)malloc(2*sizeof(int));//*a=.....
}
⑸ C語言二維動態數組作為函數形參問題
調用sum(a,x,m,i)的時候,x還沒初始化賦值呢,當然不對了
另外前邊的m和n都減一是怎麼考慮的,減了一後邊用到了m和n,malloc(sizeof(int*)*m)申請的內存還符合m行n列的要求么?
……
m=m-1;
n=n-1;//輸出數組行數與列數
a=(float**)malloc(sizeof(int*)*m);
……
*(a+i)=(float*)malloc(sizeof(int)*n);
……
r=(float*)malloc(sizeof(int)*m);
d=(float*)malloc(sizeof(int)*m);
x=(float*)malloc(sizeof(int)*m);
……
⑹ C語言中指針參數申請動態內存
voidGetMemory2(char**p,intnum)
{
*p=(char*)malloc(sizeof(char)*num);//這里動態分配內存。返回char*類型
}//分配num個位元組的內存
voidTest2(void)
{
char*str=NULL;//定義一個字元串指針賦值為空
GetMemory2(&str,100);//調用GetMemory2函數傳的事str這個指針的//地址所以上面那個函數的參數是指針的指針
strcpy(str,"hello");//字元串拷貝
cout<<str<<endl;//輸出str指向的字元串不過是C語言為什麼用//C++的輸出呢?
free(str);釋放分配的內存
}
我也是C語言新手,解釋得不是很到位。大神勿噴。有錯誤謝謝指正。好吧?
⑺ C語言中的動態內存分配的用法舉例
1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。
(7)c語言動態參數擴展閱讀:
函數運算符:
new
運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:
指針變數=new 數據類型;
例如:
int *p=new int
該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。
new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:
指針變數=new 數據類型(初始值)。
delete
堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:
delete指針變數;
其中的指針變數中保存著new分配的內存的首地址。
⑻ C語言 動態二維數組作為參數的問題
樓上的回答應該還是同樣問題 編譯不過吧?
其實你完全可以這樣定義a
a(int n, int m, long **hpos);
這樣就解決啦
⑼ c語言參數類型
一般C語言不支持返回字元串,如果一定要這樣的話,用動態分配
char *fun()
{
char *p = (char*)malloc(255);
/*給字元串p賦值的內容寫在這*/
return p;
}
然後還要有一個對應函數負責釋放空間
void unfun(char *p)
{
free(p);
}
main()
{
char *p = fun();
/* ... */
unfun(p);
return 0;
}
⑽ c語言中什麼是參數
如何寫可變參數的C函數以及這些可變參數的函數編譯器是如何實現的呢?下面是我為大家整理的關於c語言的參數介紹及使用,希望可以幫到大家哦。
簡單的可變參數的C函數
下面我們來探討如何寫一個簡單的可變參數的C函數.寫可變參數的C函數要在程序中用到以下這些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va在這里是variable-argument(可變參數)的意思.
這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件.下面我們寫一個簡單的可變參數的函數,改函數至少有一個整數參數,第二個參數也是整數,是可選的.函數只是列印這兩個參數的值.
void simple_va_fun(int i, ...)
{
va_list arg_ptr;
int j=0;
va_start(arg_ptr, i);
j=va_arg(arg_ptr, int);
va_end(arg_ptr);
printf(%d %dn, i, j);
return;
}
我們可以在我們的頭文件中這樣聲明我們的函數:
extern void simple_va_fun(int i, ...);
我們在程序中可以這樣調用:
simple_va_fun(100);
simple_va_fun(100,200);
從這個函數的實現可以看到,我們使用可變參數應該有以下步驟:
1)首先在函數里定義一個va_list型的變數,這里是arg_ptr,這個變數是指向參數的指針.
2)然後用va_start宏初始化變數arg_ptr,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數.
3)然後用va_arg返回可變的參數,並賦值給整數j. va_arg的第二個參數是你要返回的參數的類型,這里是int型.
4)最後用va_end宏結束可變參數的獲取.然後你就可以在函數里使用第二個參數了.如果函數有多個可變參數的,依次調用va_arg獲取各個參數.
如果我們用下面三種 方法 調用的話,都是合法的,但結果卻不一樣:
1)simple_va_fun(100);
結果是:100 -123456789(會變的值)
2)simple_va_fun(100,200);
結果是:100 200
3)simple_va_fun(100,200,300);
結果是:100 200
我們看到第一種調用有錯誤,第二種調用正確,第三種調用盡管結果正確,但和我們函數最初的設計有沖突.下面一節我們探討出現這些結果的原因和可變參數在編譯器中是如何處理的.
可變參數在編譯器中的處理我們知道va_start,va_arg,va_end是在stdarg.h中被定義成宏的,由於1)硬體平台的不同 2)編譯器的不同,所以定義的宏也有所不同,下
面以VC++中stdarg.h里x86平台的宏定義摘錄如下(''號表示折行):
typedef char * va_list;
#define _INTSIZEOF(n)
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )