1. 程式人生 > >C語言陣列當引數傳遞

C語言陣列當引數傳遞

在學習C語言的過程中遇到陣列作為引數傳遞的問題

一維陣列:

#include <stdio.h>

int test2(int a[]){
	for(int i=0;i<5;i++){
		printf("%d",a[i]);
	}
}
int main(){
	int a[5] = {1,2,3,4,5},*p;
	p = a;
	test2(a);
	
}

這樣我們可以很順利的在test去遍歷這個陣列a,當然我們還可能傳遞指標:

int test1(int *p){
	for(int i=0;i<5;i++){
		printf("%d",p[i]);//我們在這裡還可以用)*(p+i)來輸出陣列中的值
	}	
}

int main(){
	int a[5] = {1,2,3,4,5},*p;
	p = a;
	test1(p);
	
}


一般來數引數的傳遞是值傳遞,也就是說實參傳給形參,形參發生改變時實參並不會改變,(單向)但是陣列在傳遞的時候是地址傳遞,只要形參發生了變化,實參也會發生變化(雙向)。

這樣傳遞陣列就會發現一個問題,我沒有辦法獲取到陣列的長度。獲取陣列的長度我們一般用:

sizeof(a)/sizeof(int)
int test2(int a[]){
	int n = sizeof(a)/sizeof(int);
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
		a[i]++;
	}
}
我們會發現n的值一直是2!為什麼會這樣呢!?
因為,a是函數引數,到了本函式中,a只是一個指標(地址,系統在本函式執行時,是不知道a所表示的地址有多大的資料儲存
空間,這裡只是告訴函式:一個數據空間首地址),所以,sizoef(a)的結果是指標變數a佔記憶體的大小,一般在64位機上是8個位元組。int型別是4個位元組,所以,結果永遠是2,因此,我們要向獲取陣列長度要怎麼辦呢?

我可以在初始化陣列的地方獲取到陣列的長度,作為引數傳遞過來:

int test2(int a[],int n){
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
		a[i]++;
	}
}

int main(){
	int a[5] = {1,2,3,4,5},*p;
	int n = sizeof(a)/sizeof(int);
	test2(a,n);

	
}

這樣做我們可以獲取到陣列的長度。

二維陣列:

二維陣列作為引數傳遞是後我們不可以像以為陣列那樣直接,如:

void test1(int a[][]){
	
	for(i = 0; i < 5; i++){
		for(j = 0; j < 5; j++){
			printf("%d ",a[i][j]);
		}
	}
}

int main(){
	int a[5][5],i,j;
	for(i = 0; i < 5; i++){
		for(j = 0; j < 5; j++){
			a[i][j] = i*5 + (j +1);
		}
	}
	test1(a);
	return 0;	
}

會發現編譯都編譯不通過,報“[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first”這個錯,意思是多維陣列的定義必須有一個除第一個之外的所有維度的邊界,比如:
void test1(int a[][5]){
	
	for(int i = 0; i < 5; i++){
		for(int j = 0; j < 5; j++){
			printf("%d ",a[i][j]);
		}
	}
}
這樣就OK了,但是我們是動態分配的陣列不知道這個維度是多少的時候怎麼辦?這時候我們可以用指標當做一維陣列來操作:
void test1(int *p,int n){
	for(int i = 0; i < n; i++){
		printf("%d ",p[j]);
	}
}


int main(){
	int a[5][5],i,j;
	int *p;
	p = &a[0][0];
	for(i = 0; i < 5; i++){
		for(j = 0; j < 5; j++){
			a[i][j] = i*5 + (j +1);
		}
	}
	test1(p,25);
	return 0;	
}


這樣我們發現不能更靈活的去定位到某一行某一列,這樣我們需要手工改變定址方式:
void test2(int  m,int  n,int **p){//m,n是行和列,
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			printf("%d ",*((int *)p+n*i+j));
		}
	}
}

int main(){
	int a[5][5],i,j;
	
	for(i = 0; i < 5; i++){
		for(j = 0; j < 5; j++){
			a[i][j] = i*5 + (j +1);
		}
	}
	test2(5,5,(int **)a);
	return 0;	
}




相關推薦

C語言陣列引數傳遞

在學習C語言的過程中遇到陣列作為引數傳遞的問題 一維陣列:#include <stdio.h> int test2(int a[]){ for(int i=0;i<5;i++){ printf("%d",a[i]); } } int main()

c語言之函式引數傳遞陣列

在VC中寫程式都習慣了,一般陣列作為函式實參時,最常用的方法就是引用和指標的方法,但是到C語言中就沒有引用了,還有一種比較常用的方法: #include <stdio.h>void sort(int array[],int n)...{int i,j,k,t;f

C語言中函式引數傳遞的兩種方式

問題及程式碼: /* *完成日期:2018.10.2 * *問題描述:c語言函式引數傳遞的兩種方式 * */ #include <stdio.h> void swap1(int x, int y); //對交換函式myswap1的提前宣告 (傳值

C語言結構體引數傳遞

結構體的形參或實參傳遞和和一般的程式一樣: #include<stdio.h> #include<string.h> struct student //結構體定義 { char name[10]; int age; double height; }; void ch

C++】陣列作為引數傳遞的那些事兒

先看程式碼: #include <cstdio> void foo(int array[2]) { printf("int array[2]:\t\t%x %d\n", &array, sizeof(array)); } vo

第二週專案1-C/C++語言中函式引數傳遞的三種方式

問題及程式碼: /*  * Copyright (c) 2016,煙臺大學計算機與控制工程學院  * All rights reserved.  * 檔名稱:Cpp1.cpp  * 作者:張相如  * 完成日期:2016年9月5日  * 版本號:v1.0  *   * 問題

c語言的函式引數傳遞機制

看《深入理解計算機系統》覺得深入理解了函式之間的引數傳遞,但是今天一寫程式碼就出錯了。 函式對接收進來的引數都會在自己的執行時間和空間內(棧段和暫存器)有一個拷貝,所有都是,指標也是,只不過指標指向地址還是那個。 程式碼一,引數為普通變數 void foo(int a)

C語言陣列與指標作為傳遞引數的使用

       學習筆記中的內容多少會有一點文不對題,因為C語言中陣列無法作為函式的一個傳遞引數。而陣列名在作為函式傳遞引數使用的時候實際上也被轉換成了一個指標。 編寫如下程式碼; #include"s

mooc 二維陣列引數傳遞,二維陣列的應用 五子棋,多項式加法 鞍點 c語言

首先我們複習一下將二維陣列作為形參傳遞的方式:1. func(type array[ ][3],int size)2.func(type array[10][2],int size)3.func(type *array[ ],int size)4.func(type **ar

C語言陣列元素地址作為函式引數

今天首先來做一個題,值得借鑑。 #include<stdio.h> void fun(int *p){ printf("%d",p[5]);//列印第六個元素,但是地址傳入的第四個元素, getchar(); } void

C語言 陣列做函式引數

看下面程式碼:int main() { int a[5]={3,6,4,2,5}; char *ptrChar="hello world";//ptrChar是char型別的指標,指向記憶體空間 int *ptrInt=a;//ptrInt是指向int型別的指標 p

C語言的參數傳遞原理解析(值傳遞)

知識 這樣的 沒有 com 傳遞 class 分享 分配 nbsp 本講我們和大家一起來聊一聊C語言中有關參數傳遞的一些知識。 1.問題引入 請寫出以下程序的打印結果。 #include // 將某整數加10 void add_by_10(int a){ a = a + 1

資料結構---棧(C語言陣列實現)

https://blog.csdn.net/morixinguan/article/details/51374184 資料結構---棧(C語言陣列實現)   棧的全名稱為堆疊,棧其實就是與佇列相反的過程,佇列是先進先出,而棧便是先進後出了,如下圖:  

資料結構---佇列(C語言陣列實現)

https://blog.csdn.net/morixinguan/article/details/51374296 資料結構---佇列(C語言陣列實現)   佇列是先進先出的過程。簡單地畫一幅畫來描述一下佇列: 一個簡單的、由陣列實現的佇列,可以由以下幾種最基本的操

c語言 陣列中字串的旋轉(左旋)(右旋)

     在陣列中定義一個字串,該字串由“ abcdef ” 組成,所謂左旋即是讓左邊的第一個字元旋轉到右邊去,左旋一個字元即是產生“ bcdefa ”這樣的字串,右旋與之相反。      為了控制左(右)旋的字元數,需要製作一個可以改

c語言陣列中a和&a[0]的區別

p=a與p=&a[o] 等價解釋: p=&a[0] 與 p=a 等價是指,a和&a[0] 指向同一個地址(只是表示的意義不一樣)。 a是整個元素的地址,也就是陣列的起始地址,而&a[0]是陣列首元素a[0]的地址,所以他們指向的地址是相同的. 這兩者的

Variant型別在各語言中的引數傳遞

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

BMP轉成C語言陣列檔案工具(用image2lcd代替bmp2h exe)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言陣列元素的查詢

對無序陣列的查詢 所謂無序陣列,就是陣列元素的排列沒有規律。無序陣列元素查詢的思路也很簡單,就是用迴圈遍歷陣列中的每個元素,把要查詢的值挨個比較一遍。請看下面的程式碼: 1 #include <stdio.h> 2 int main(){ 3 int nums[10] =

C語言陣列地圖求最近距離

問題:假設有一張地圖,上面有著阻礙物,入口,出口。求出入口到出口的最短距離 在陣列中是這樣的:有一個8*8的陣列,1障礙物 0路 3入口 4出口 1 1 1 1 1 1 1 3 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1