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");} 你可能對形參和實參有些混淆。為了說明清楚,將f函式的形參換個字母,不影響程式的正確性。f int t 在執行f s 時,首先建立了一個臨時變數int t,然後執行了賦值t s。注意,s沒有受到任何改變。現在,t指向了變數b。然後,又建立了一個臨時變數a,他的值是5.接著,令t a。所以t指向了變數a... 不對。int,char或者自定義的類可以通過值引數和引用引數兩種方式傳遞給函式,陣列不行。陣列是兩種指標傳遞 void sort int a 對於指標a來說是值傳遞,對於陣列來說是指標傳遞 void sort int a 100 這種方法類似於引用,但實質上還是指標傳遞 謝3哥 當然對了 1,引用 ... 這個沒涉及到傳引數啊,簡單,先不提傳引數,你可以在formclosed 事件裡呼叫重新整理主窗體資料的一個方法,也就是複製貼上下你那個查詢所有資料的方法就行了,因為資料庫是動態的.別告訴我你沒資料庫.如果想傳遞引數,有多種辦法,你可以給新窗體新增構造方法,方法括號裡引數是主窗體實體類,如果想在這個新...
c語言關於函式形參的問題,C語言函式的形參問題
c陣列可以通過值引數和引用引數兩種方式傳遞給函式”的說法對否
c求教窗體間傳參問題