C 傳值引數的小問題,關於C 函式引數傳遞的問題!好奇葩。。。從未遇到過,求大神解釋

時間 2022-03-08 17:00:19

1樓:匿名使用者

書上說的意思是,i的值通過*ip=0;變成了0,但&i的值沒有受到ip=0;而影響到,換句話說i的值改變了,但i的地址沒有受ip=0;的影響而改變。

原因是reset(&i);傳遞給函式的是一個數值,這個數值是i的地址,函式用這個數值當成指標進行賦值,當函式將這個數值改變時,不會影響到呼叫者變數i的地址。

2樓:匿名使用者

void reset(int *ip)

int i = 42;

reset(&i);

cout << "i =" << i << endl;

3樓:

夥計:先要清楚,reset(&i)中的i並不是「值傳遞」,而是「引用傳遞」。引用傳遞可以粗略地理解為把實參變數本身傳遞過去了,函式中操作這個「引用」就是在操作實參變數本身,所以會引起實參的永久性改變。

而其他的函式引數傳遞,包括指標傳遞,傳給函式的都是「值拷貝」,所以函式中對形參的所有操作都侷限在「函式內部」,一旦函式返回,所有在函式內部的操作都失去效果。c++的函式的引用形參,就是為解決c函式的傳值缺陷而誕生的……

4樓:匿名使用者

換種思路思考 ,或者從函式實際傳參原理思考就簡單了。由typedef特性可以將所有指標類 、引用類區個別名,引用可以看作會自動呼叫解引用操作並且指向不變的指標,除了陣列的delete之外,一切特性都和struct差不多 ,而struct作為引數,隱藏實現細節,又是和基本型別的傳值是一樣的,即都是拷貝,對指標作為引數來說,任何對改指標的修改都是在修改一份傳進來的拷貝,而解引用和下標操作都進行了運算,獲取的物件都不是該指標,而是指標進行運算後所得到的物件。個人 覺得這樣能更好的理解 函式引數修改的問題。

i不是實參 &i 獲取的i的地址才是實參,該值是一個臨時值,所以實參沒用被改變。

5樓:匿名使用者

&i 是實參,並且它的值絕無可能改變

c++把陣列當做引數傳遞到方法裡的小問題。

6樓:匿名使用者

陣列作為引數傳遞,傳遞的是陣列的起始地址,可以認為是a指標的副本,因為在傳遞過程中以及在函式func中a退化為int*,而不再是與a相同的指標常量,這些對原呼叫函式中的a沒有影響

直接定義引用型別的比較少吧?一般在函式宣告的引數宣告部分使用引用型別,目的在於實現對引數的修改,相當於指標,但比指標容易和安全,因此可以認為是傳遞的其地址

一般直接傳遞都為 傳值傳遞,即僅將實參副本傳入函式,函式中隊形參的修改不會影響實參

若要求實現對實參的修改,一般需要宣告為形參引用

7樓:倒黴熊

1:傳進去的指標是最初定義a時的指標.

在普通變數或下標變數作函式引數時,形參變數和實參變數是由編譯系統分配的兩個不同的記憶體單元。在函式呼叫時發生的值傳送是把實參變數的值賦予形參變數。在用陣列名作函式引數時,不是進行值的傳送,即不是把實引數組的每一個元素的值都賦予形引數組的各個元素。

因為實際上形引數組並不存在,編譯系統不為形引數組分配記憶體。那麼,資料的傳送是如何實現的呢? 陣列名就是陣列的首地址。

因此在陣列名作函式引數時所進行的傳送只是地址的傳送, 也就是說把實引數組的首地址賦予形引數組名。形引數組名取得該首地址之後,也就等於有了實在的陣列。實際上是形引數組和實引數組為同一陣列,共同擁有一段記憶體空間。

2:傳他們各自的一個副本

8樓:匿名使用者

創造一個a的指標的副本,然後再把這個副本傳進去

定義了一個int c = 3,還有一個引用型別,比如int &c; 如果把他們分別傳進相應的方法,他們是傳本身

9樓:

就拿上例來說 如果執行func(a) 則是將實參a陣列的首元素的地址傳遞給形參b,也就是說 a和b一起佔同一段記憶體單元 這個與變數作為函式引數是不同的 不需要創造副本 你說的第二個問題是引用傳遞 引用傳遞跟剛才的陣列(指標)傳遞一樣 傳的是他們的地址 也就是不需要創造副本 與此還有一個值傳遞 這個是需要創造副本的 而且 函式對傳遞的值 沒有任何改變 隻影響在函式體中產生的副本的值 你可以就指標傳遞 引用傳遞 還有值傳遞 研究一下 有利於以後的深入學習

關於c++函式引數傳遞的問題!好奇葩。。。從未遇到過,求大神解釋~

10樓:匿名使用者

1說明為了便於顯示除錯資訊,我稍微修改了一下。

經過除錯,首先發現insert函式有問題,問題如下,修改也如下;

//struct adapt a=;//刪除

//struct adapt *stud;stud=&a;不能返回區域性變數地址,函式呼叫後區域性地址被清除//刪除該句

struct adapt *stud=(struct adapt*)malloc(len);//增加

其次search函式也有問題,search函式查詢時,若最後一個結點與查詢的數相同,會返回-1。

2**2.1最終執行圖

2.2沒有修改search函式時。

測試資料為

5 51 2 3 4 5

3 2 4 1 5

2.2修改search函式後

2.4沒有除錯資訊的**輸出

3.**如下

#include "iostream"

using namespace std;

#include

#define len sizeof(struct adapt)

struct adapt//連結串列

int n;

struct adapt *next;

};struct adapt *creat(int x)//建立含有x個元素的連結串列

struct adapt *head;

struct adapt *p1,*p2;

int n=0;

p1=p2=(struct adapt*) malloc(len);

cin>>p1->n;

head=null;

while(1)

n=n+1;

if(n==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(struct adapt*)malloc(len);

if(ncin>>p1->n;

else break;

p2->next=null;

return(head);

}int search(struct adapt *p,int n)//在連結串列中查詢數值為n的數,返回序號

cout<<"search:"

if(p->next==null)

if(p->n==n)

k++;

return(k);

else return(-1);

else

while(p->next!=null)

k++;

if(p->n==n) break;

p=p->next;

if(p->next==null) ///*********先判斷p是否為n,否則若最後一個數為n,會返回-1

if(p->n==n)

k++;

return(k);

else return(-1);

//if(p->next==null) return(-1);

else return(k);

}struct adapt *del(struct adapt *head,int num)//從連結串列中刪除數值為num的數

cout<<"delete:"

if (head==null)

return(head);

else

p1=head;

while(num!=p1->n && p1->next!=null)

if(num==p1->n)

if(p1==head)

head=p1->next;

else

p2->next=p1->next;

return(head);

}struct adapt *insert(struct adapt *head,int n)//在連結串列首部插入n

cout<<"insert:"

//struct adapt a=;

//struct adapt *stud;stud=&a;不能返回區域性變數地址,函式呼叫後區域性地址被清除

struct adapt *stud=(struct adapt*)malloc(len);//

stud->n=n;

if(head==null)

else

stud->next=head;

return(stud);

}/*------------*/

void showlink(struct adapt * head)//顯示連結串列資訊

struct adapt * temp=head;

cout<<"link data:";//

while (head!=null)

cout<<"->"

head=head->next;

cout

/*------------*/

int main()

int n,m,s;

cin>>n>>m;

int *q=new int[m];

struct adapt* p;

p=creat(n);

for(int i=0;icin>>q[i];

}for(int j=0;jcout<<"【times:"

showlink(p);//--------------顯示查詢後連結串列狀況

cout

showlink(p);//---------顯示刪除結點後連結串列狀況

p=insert(p,q[j]);

showlink(p);//--------顯示插入結點後連結串列狀況

system("pause");//系統命令,暫停

}4.沒有除錯資訊的**

#include "iostream"

using namespace std;

#include

#define len sizeof(struct adapt)

struct adapt

int n;

struct adapt *next;

};struct adapt *creat(int x)

struct adapt *head;

struct adapt *p1,*p2;

int n=0;

p1=p2=(struct adapt*) malloc(len);

cin>>p1->n;

head=null;

while(1)

n=n+1;

if(n==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(struct adapt*)malloc(len);

if(ncin>>p1->n;

else break;

p2->next=null;

return(head);

}int search(struct adapt *p,int n)

int k=0;

if(p->next==null)

if(p->n==n)

k++;

return(k);

else return(-1);

else

while(p->next!=null)

k++;

if(p->n==n) break;

p=p->next;

if(p->next==null) ///*********先判斷p是否為n,否則若最後一個數為n,會返回-1

if(p->n==n)

k++;

return(k);

else return(-1);

//if(p->next==null) return(-1);

else return(k);

}struct adapt *del(struct adapt *head,int num)

struct adapt *p1,*p2;

if (head==null)

return(head);

else

p1=head;

while(num!=p1->n && p1->next!=null)

if(num==p1->n)

if(p1==head)

head=p1->next;

else

p2->next=p1->next;

return(head);

}struct adapt *insert(struct adapt *head,int n)

struct adapt *p=null;

//struct adapt a=;

//struct adapt *stud;stud=&a;不能返回區域性變數地址,函式呼叫後區域性地址被清除

struct adapt *stud=(struct adapt*)malloc(len);//

stud->n=n;

if(head==null)

else

stud->next=head;

return(stud);

}int main()

int n,m,s;

cin>>n>>m;

int *q=new int[m];

struct adapt* p;

p=creat(n);

for(int i=0;icin>>q[i];

}for(int j=0;js=search(p,q[j]);

cout

p=insert(p,q[j]);

system("pause");}

c語言關於函式形參的問題,C語言函式的形參問題

你可能對形參和實參有些混淆。為了說明清楚,將f函式的形參換個字母,不影響程式的正確性。f int t 在執行f s 時,首先建立了一個臨時變數int t,然後執行了賦值t s。注意,s沒有受到任何改變。現在,t指向了變數b。然後,又建立了一個臨時變數a,他的值是5.接著,令t a。所以t指向了變數a...

c陣列可以通過值引數和引用引數兩種方式傳遞給函式”的說法對否

不對。int,char或者自定義的類可以通過值引數和引用引數兩種方式傳遞給函式,陣列不行。陣列是兩種指標傳遞 void sort int a 對於指標a來說是值傳遞,對於陣列來說是指標傳遞 void sort int a 100 這種方法類似於引用,但實質上還是指標傳遞 謝3哥 當然對了 1,引用 ...

c求教窗體間傳參問題

這個沒涉及到傳引數啊,簡單,先不提傳引數,你可以在formclosed 事件裡呼叫重新整理主窗體資料的一個方法,也就是複製貼上下你那個查詢所有資料的方法就行了,因為資料庫是動態的.別告訴我你沒資料庫.如果想傳遞引數,有多種辦法,你可以給新窗體新增構造方法,方法括號裡引數是主窗體實體類,如果想在這個新...