c語言傳遞數組
A. c語言數組的地址傳遞和值傳遞
1.值傳遞就不寫了,顧名思義就是把當前的值傳到下一個函數中,變數本身的沒有發生任何變化
2.指針傳遞,把當前變數指針傳到下一個函數,在另外函數里邊修改指針的值會修改當前變數值
#include <stdio.h>
void func(int *p){
亮謹 *p = 9;
return;
}
void swap(int *a, int *b){ //交換兩個變數的值
int temp = *a;
*a = *b;
*b = temp;
}
int main(void){
int a = 0;
func(&a); //要修改燃慎一個變數,把他的地址傳過去
printf("%d",a);//9
int b = 3;int c = 4;
敬段基 swap(&b,&c);
return 0;
}
B. C語言數組當參數傳遞
在學習C語言的過程中遇到數組作為參數傳遞的問題
一維數組:
這樣我們可以很順利的在test去遍歷這個數組a,當然我們還可能傳遞指針:
一般來數參數的傳遞是值傳遞,也就是說實參傳給形參,形參發生改變時實參並不會改變,(單向)但是數組在傳遞的時候是地址傳遞,只要形參發生了變化,實參也會發生變化(雙向)。
這樣傳遞數組就會發現一個問題,我沒有辦法獲取到數組的長度。獲取數組的長度我們一般用:
我們會發現n的值一直是2!為什麼會這樣呢!?
因為,a是函數參數,到了本函數中,a只是一個指針(地址,系統在本函數運行時,是不知道a所表示的地址有多大的數據存儲空間,這里只是告訴函數:一個數據空間首地址),所以,sizoef(a)的結果是指針變數a占內存的大小,一般在64位機上是8個位元組。int類型是4個位元組,所以,結果永遠是2,因此,我們要向獲取數組長度要怎麼辦呢?
我可以在初始化數組的地方獲取到數組的長度,作為參數傳遞過來:
這樣做我們可以獲取到數組的長度。
二維數組:
二維數組作為參數傳遞是後我們不可以像以為數組那樣直接,如:
會發現編譯都編譯不通過,報「[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first」這個錯,意思是多維數組的定義必須有一個除第一個之外的所有維度的邊界,比如:
這樣就OK了,但是我們是動態分配的數組不知道這個維度是多少的時候怎麼辦?這時候我們可以用指針當做一維數組來操作:
這樣我們發現不能更靈活的去定位到某一行某一列,這樣我們需要手工改變定址方式:
C. C語言 主函數傳遞數組給子函數
你的
代碼
不全,我只能給你分析一下這種情況常見的錯誤了。
1、要返回
數組
定義
在子
函數
中。在函數體內部定義的數據
變數
,如果未加修飾符(static和extern),那麼她是局部的,函數執行完畢之後
內存
釋放,造成你訪問
錯誤
。你
下邊
的那個例子定義的數組是
全局變數
,先不說了下班了晚上補充
D. C語言函數傳遞二維數組
C語言如果給函數傳遞二維數組作為參數
先看一個傳遞二維數組的例子:
編譯:
程序看著沒有任何問題,但是編譯器通不過,報錯在處理二維數組參數a的時候,類型不兼容。
C語言裡面對二維數組的存儲是按照一維數組來處理的,二維數組按照行展開的方式按順序存儲,例如在上面的例子中:
二維數組a的定義:
它等同於一維數值的定義:
因為他們的空間存儲分配一樣的。
所枝伍培以在利用二維數組作為參數傳遞時,必須指定二維數組的列數,否則函數無法勾畫出二維數組的猛唯組織形式。只有有了列長度,通過下標a[i][j]時才能得到正確的下標地址,即:
我們改一下上面的額foo函數定義:
編譯運行:
這下就正常了。
參數如上所列。
我們看到,函數的參數聲明改成了:
這個聲明的含義是:
不過此時還是需要指定二維數組的列長度,不然函數內部還是無法使用二維下標去訪問數組:
編譯:
原因同前面方法1一致,如果要訪問二維數組,必須指定列的長度,否則無法計算橘瞎出該元素的地址,a[i][j]=a [ (i-1)*COLNUM + j ],如果沒有COLNUM,那麼這個地址無法計算出來。從形參的聲明來說,a就是一個指針,指向一維數組的指針,而不是一個二維數組。
這里要注意的是指針的指針,和二維數組的差異;二維數組的地址是連續的,所有成員按順序排序;而指針的指針只要求指針地址連續,而不要求指針的指針地址連續。
然後作為實參傳遞時,也不能直接使用a傳遞,因為類型不匹配,必須定義新的變數p,然後把a的值賦給p,再傳遞給foo函數。
E. c語言 如何把數據文件中的數據傳給數組
1.
先打開文件。
2.
自己寫過getline函數,脊悄取文本的一行保存到一個字元串中。
3.
用malloc函數給line分配空間。
4.
對於第一行,取特定的字元串line取代替它,如果第二行是空行也這么做
5.
在建立一個字元串數組,用strp將他們放入字元串數組strline[i]中。
6.
構造一個結構數組,將得到的字元串line用櫻備渣strtok(line,"
")函數分開依次放入結構數組中的字元串成員中,記得不能用字元串數組的字元串,strtok函數會改變字元串的,而line就無所謂了。
7.
知道用getline函數返回一個負滾舉數(一般我用負數標記文檔讀寫完畢)。結束讀操作。
8.
現將前面的名字以及空行寫入new的文本中,用putline函數(將字元串寫入文檔中)。
9.
再從字元串數組逆序寫入new的文本中。
10.
如果結構數組不用了,就釋放strp分配的空間,並且以及line的空間,前面兩行無所謂,反正占的空間不大。所有用數組,還是動態分配都沒什麼大的關系。
F. c語言 數組作為參數傳遞
調用時把【】去掉,表示掉用這個數組的所有元素,數組的名稱表示數組第一個元素的地址。
數組的定義可以寫成:
int
table[]={1,2,3,}
或者table[3],不能寫成table[],因為系統在定義數組時就給數組分配了地址,table[]沒有確定元素的個數,不能分配地址空間。
但是作為形參,可以這樣寫,void
tab(int
table[])
,不知道為什麼,呵呵
G. C語言中,數組作為參數,怎樣在函數之間傳遞的
很簡單的,數組作為函數參數傳遞的時候只要是數組名就可以了,因為數組名本身就是數組的首地址 .給個程序看看
#include<stdio.h>
#define N 3
int array[N][N];
void main()
{
//在主函數內聲明被調函數
void convert(int array[][3]);
int i,j;
printf("輸入數組:\n");
for(j=0;j<N;j++)
for(i=0;i<N;i++)
scanf("%d",&array[i][j]);
printf("\n");
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
printf("%d\t",array[i][j]);
printf("\n");
}
//調用矩陣轉置函數
convert(array);
printf("\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d\t",array[i][j]);
printf("\n");
}
}
void convert(int array[][3])
{
int i,j,t;
for(i=0;i<N;i++)
for(j=0;j<N;j++)//設置數組中轉置矩陣元素交換
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
H. c語言:關於參數傳遞數組
嗯,一般傳遞數組是這樣的:
int a[3]={1,2,3}; //定義數組
void fun(int [],int length); //申明函數,第一個參數是數組頭地址,第二個參數是數組長度
fun(a,sizeof(a)/sizeof(int)) ; //調用函數,a為數組頭地址,sizeof()獲取位元組數。
所以你的程序有點解釋不清,呵呵~~~還是按照一般的規范來編程會好點。
具體點你的程序應該是這樣的:
x(int [ ], int length){
}
main()
{int a[10];
x(a,sizeof(a)/sizeof(int));
}
I. c語言函數怎麼傳數組
C和C++都沒有辦法傳數組,只能傳「指針」,指針和數組的差別就在於函數內無法檢測數組的尺寸
J. c語言數組在函數中的傳遞
c語言中、數組在函數中的傳遞可以數組元素的傳遞!還有就是數組名的傳遞!其實、數組名的傳遞類似指針!就是把數組的元素的首地址傳到形參的!