c語言函數傳參數
1. c語言函數參數傳出怎麼用
struct Student st;
void function(struct Student st);這種形式就是傳遞地址;
void fuction2(struct Student * pst);這種形式就是傳遞結構體的地址;
調用這兩個函數的形式如下:
function(st);
fuction2(&st);
一般推薦第二種方式,因為第一種方式需要傳遞整個結構體,需要開辟sizeof(struct student)這么大的內存空間,開銷太大,第二種方式則只需要開辟四個位元組的內存,用來存放地址;
2. C語言自定義函數怎麼傳參,一次性把數組的數據全部傳入
數組參數屬於指針參數.
指針參數即時傳址參數(或叫引用參數), 如果想在函數中修改參數的值, 這是唯一的途徑.
如果把數組當作參數, 不管你願意與否, 它就是指針, 指向第一個值的指針.
1. 數組參數就是指向第一個元素的指針: #include <stdio.h>
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
2. 乾脆直接聲明為指針: #include <stdio.h>
void getArr(int *p, int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int *p, int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
3. 即使你在形參中指定維數也不起作用: #include <stdio.h>
void getArr(int p[2], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[2], int si) {
int i;
for (i = 0; i < si; i++) {
printf("%d\n", p[i]);
}
}
4. 既然是指針, 其值就有被修改的可能: #include <stdio.h>
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
size_t i;
getArr(ns, sizeof(ns)/sizeof(ns[0]));
for (i = 0; i < sizeof(ns)/sizeof(ns[0]); i++) {
printf("%d\n", *(ns+i));
}
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i < si; i++) {
p[i]++;
}
}
5. 如果是字元數組, 它自己能判斷數組尾界: #include <stdio.h>
void getArr(char p[]);
int main(void)
{
char ns[] = "ABCDEFG";
getArr(ns);
getchar();
return 0;
}
void getArr(char p[]) {
int i;
for (i = 0; p[i]; i++) {
printf("%c: %d\n", p[i], p[i]);
}
}
3. C語言函數調用參數傳遞的是什麼
C語言傳遞的是值而不是地址,這一點從VB轉過來的程序員一定要注意。否則不經意間就會犯錯誤。另外下層函數修改上層函數變數不是一種好習慣,容易引發錯誤。C語言中函數可以返回一個函數值,如果你需要返回多個函數值可以用下面的形式
fun(int *a, int *b)
{ *a=1;*b=2;}
main()
{ int a, b;
fun(&a,&b) a,b的值被改變
}
如果按VB的習慣,
fun(int a, int b)
{ a=1;b=2;}
main()
{ int a, b;
fun(a,b);a、b的值沒有改變
}
是錯誤的,main中的a,b和fun中的a,b完全是兩碼事,結果就是調運fun沒有任何效果。
4. c語言向函數傳遞函數作為參數
#include<stdio.h>
//---子函數聲明---//
intfunc1();
intfunc2(int(*func1)());//形參為函數指針(即指向函數的指針)
//---主函數---//
intmain(){
printf("向函數二傳遞函數一, 即函數一作為函數二的參數。 ");
printf("%d",func1());
printf("%d ",func2(func1));//注意函數名即為函數地址!!!!!!
}//實參為函數名func1或者&func1,兩者等價,而非func1()
//---子函數定義---//
intfunc1(){
return1;
}
intfunc2(int(*func1)()){//形參為函數指針(即指向函數的指針)
returnfunc1()+1;
}
5. c語言函數傳參問題
說下傳值,傳址以及引用吧。
傳值,就是把你的變數的值傳遞給函數的形式參數,實際就是用變數的值來新生成一個形式參數,因而在函數里對形參的改變不會影響到函數外的變數的值。
傳址,就是傳變數的地址賦給函數里形式參數的指針,使指針指向真實的變數的地址,因為對指針所指地址的內容的改變能反映到函數外,也就是能改變函數外的變數的值。
傳引用,實際是通過指針來實現的,能達到使用的效果如傳址,可是使用方式如傳值。
說幾點建議:
如果傳值的話,會生成新的對象,花費時間和空間,而在退出函數的時候,又會銷毀該對象,花費時間和空間。
因而如果int,char等固有類型,而是你自己定義的類或結構等,都建議傳指針或引用,因為他們不會創建新的對象。
6. 在C語言中,定義一個函數的形參和實參之間具體是如何進行參數傳遞的
傳值調用和引用調用傳值調用和引用調用指的是用於參數傳遞過程中的一種機制。傳值調用中,只使用了實參的值。傳值調用機制里,形參是一個局部變數,其初始值為相應實參的值。在引用調用機制里,將實參的地址傳遞給形參,從表面上看是以實參變數取代形參,因此任何發生在形參上的改變實際上都發生在實參變數上。
形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。沒有形參的函數在形參表的位置應該寫void.main
函數也可以有形參和返回值,其形參也稱為命令行參數,由操作系統在啟動程序時初始化,其返回值傳遞給操作系統。
形參和實參的對照實例(C語言版)main(){int
n;printf("input
number
\n");scanf("%d",&n);s(n);printf("n=%d\n",n);}int
s(int
n){int
i;for(i=n-1;i>=1;i--)n=n+i;printf("n=%d\n",n);}
7. c語言中,帶參數的主函數,如何傳遞參數給它
不可能按值傳遞的,設想一下
type
*arr
=。。。。。
sizeof(arr)為100萬了位元組,如果按照值傳遞,就要創建一個臨時變數temp也為100萬個位元組,效率豈不是太低了。再可能arr是堆內存,參數傳遞是要屬性相同,值相同,難道系統自行去new一段內存,這該用戶去釋放
還是系統自動回收呢?
8. c語言函數參數傳遞方向
C語言中函數參數傳遞的三種方式(1)傳值,就是把你的變數的值傳遞給函數的形式參數,實際就是用變數的值來新生成一個形式參數
9. C語言函數參數的傳入
你這是
參數傳遞
進去的其實是數組的地址,在函數內部修改了以後,數組的內容就已經真正的修改了,所以函數返回以後,繼續訪問這個數組,得到的數據就是修改以後的。
比如:
int array[12][12];
_arcs(arrar)
在訪問array就是修改後的數據了
10. c語言:字元串做為函數參數傳遞
1、值傳遞
void swap(int x,int y)
{ int temp = x;
x = y;
y = temp;
}void main()
{
int a = 10, b = 20;
swap(a, b);
}
執行後,並不會交換。
2、引用傳遞
void swap(int &x,int &y)
{ int temp = x;
x = y;
y = temp;
}void main()
{
int a = 10, b = 20;
swap(a, b);
printf("a=%d b=%d ", a, b);
}
執行後,發生交換。
3、指針傳遞
void swap(int *x,int *y)
{ int temp = *x; *x = *y; *y = temp;
}void main()
{
int a = 10, b = 20;
swap(&a, &b);
printf("a=%d b=%d ", a, b);
}
執行後,發生交換。
參數傳遞只有上面三種,但是如果加上數組,就會產生幾種新形式。
首先,明確數組型變數名本身只是該數組所佔存儲空間的首地址:
int a[3] = { 1, 2, 3 }; int *p = a; //等價於下行 //int *p = &a[0];
printf("%d", *p);
典型的數組做參數。
void fun(char s[]){ for (int i = 0; s[i] != '