c語言指針傳遞引用傳遞
1. 請問在c語言中,函數傳參時怎樣利用指針傳遞數組
數組名就是指針,例如:
#include <stdio.h>
voidpr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
(1)c語言指針傳遞引用傳遞擴展閱讀:
注意事項
非數組類的聲明盡量以指針的方式進行比較好。倘若一個指針指向的內存並不是一個數組,那麼採用數組名的聲明方式或許就會給人產生錯誤的引導。類似的,如果指向的是一個數組區域,則會給人以更加豐富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
與
int main(int argc,char** argv)
{
/* code here */
}
兩種方式完全等價,但是前面一種能夠更清晰地看出:這個參數是指向某個元素起始地址的指針,而後面的這種方式則不能夠直觀地看出這種含義。
2. C語言中的參數傳遞方式有哪些
是函數參數的傳遞方式吧。c語言的話是:值傳遞和指針(地址)傳遞。c++的話除了c語言的兩種方式外還有引用傳遞。
3. 在c語言中,指針作為函數參數,形參只能傳遞值,而不能傳遞地址,是怎麼回事
C語言中,函數參數只能傳值。與傳值對應的是傳引用,C語言不支持函數參數傳引用,C++語言才支持。
C++傳引用函數:
void foo(int& a) { a = 3; }
假如a = 2,執行foo(a)後,a = 3。
---
C語言可以模擬傳引用,方法是通過指針來實現:
void foo2(int* ap) { *ap = 3; }
假如a = 2,執行foo2(&a)後,a = 3
foo2(&a)調用本質上仍然是傳值,只不過傳遞的是指針,指針即是地址,地址本質上是一個無符號整數。
如果:
void foo3(int b) { b = 3; }
假如a = 2,執行foo3(a)後,a = 2。這是因為foo3(a)調用過程中,a值傳給形參b,修改b的值與實參a無關。
注意到,foo3(a)與上述foo(a)傳引用的調用是形式一樣的。
既然C語言通過指針可以實現傳引用調用,為什麼C++還要引入引用這個特性呢?這是因為C++引入的很多新特性需藉助引用來實現,比如,拷貝構造函數等等。
4. c語言,返回函數的三種方法,請解釋明白點,有例子更好了
函數參數和
返回值
三種傳遞方式:值傳遞、指針傳遞和引用傳遞
引用與指針的比較
引用是
C++中的概念,初學者容易把引用和指針混淆一起。一下程序中,n
是m
的一個引用(
reference
),m
是被引用物(referent)。
int
m;
int
&n
=
m;
n
相當於m
的別名(綽號),對n
的任何操作就是對m
的操作。所以n
既不是m
的拷貝,也不是指向m
的指針,其實n
就是m
它自己。
C++語言
中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。
以下是「值傳遞」的示常式序。由於Func1
函數體內的x
是
外部變數
n
的一份拷貝,改變x
的值不會影響n,
所以n
的值仍然是0。
void
Func1(int
x)
{
x
=
x
+
10;
}
int
n
=
0;
Func1(n);
cout
<<
「n
=
」
<<
n
<<endl;
//
n
=
0
以下是「指針傳遞」的示常式序。由於Func2
函數體內的x
是指向外部變數n
的指針,改變該指針的內容將導致n的值改變,所以n
的值成為10。
void
Func2(int
*x)
{
(*
x)
=
(*
x)
+
10;
}
int
n
=
0;
Func2(&n);
cout
<<
「n
=
」
<<
n
<<endl;
//
n
=
10
以下是「引用傳遞」的示常式序。由於Func3
函數體內的x
是外部變數n
的引用,x
和n
是同一個東西,改變x
等於改變n,所以n
的值成為10。
void
Func3(int
&x)
{
x
=
x
+
10;
}
int
n
=
0;
Func3(n);
cout
<<
「n
=
」
<<
n
<<endl;
//
n
=
10
對比上述三個示常式序,會發現「引用傳遞」的性質象「指針傳遞」,而書寫方式象「值傳遞」。實際上「引用」可以做的任何事情「指針」也都能夠做,為什麼還要「引用」這東西?
答案是「用適當的工具做恰如其分的工作」。
5. C/C++語言-指針與引用的區別
一、指針:
1.指針的定義:
指針作為實體,是一個用來保存一個內存地址的計算機語言中的變數。指針一般出現在比較底層的程序設計語言中,如C語言。高層的語言如Java一般避免用指針,而是引用。
指針作為數據類型,可以從一個函數類型、一個對象類型或者一個不完備類型中導出。從中導出的數據類型稱之為被引用類型(referenced type)。指針類型描述了一種對象,其值為對被引用類型的實體的引用。
2.* 和 &符號
這個時候能改變a的值,而
改為
就無法改變a的值。
在執行inc(&a);時,系統在內存分配表裡增加了一行「inc 中的val」,其地址為新地址,值為&a。操作*val,即是在操作a 了。
二.引用
1.引用的定義:
(1)引用就是某個目標變數的「別名」,對應用的操作與對變數直接操作效果完全相同。
(2)申明一個引用的時候,切記要對其進行初始化。
2.引用的特點:
(1)傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變數或對象的一個別名來使用,所以在被調函數中對形參變數的操作就是對其相應的目標對象(在主調函數中)的操作。
(2)使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函數的參數,當發生函數調用時,需要給形參分配存儲單元,形參變數是實參變數的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變數傳遞參數的效率和所佔空間都好。
(3)使用指針作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重復使用"*指針變數名"的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變數的地址作為實參。而引用更容易使用,更清晰。