1樓:曾楊氏汝雁
不要以為用指標做引數就是位址傳遞方式,因為你主函式中的p是指標,要想在函式中改變主函式中指標的值,應該以指標的指標的方式傳遞引數:
voidchange(
char**q+*q;
q;printf(%s",q
intmain()
char*p
hello";
change(p
printf(%s",p
另外,在定義char*
p字串,在使用之前並不是必須要用malloc(),你的程式就是乙個仔森很好的例子,因為"hello"是乙個字串常顫乎量,所有的常量(包括其它資料型別的常量),編譯器會自動為它們分配儲存空間,不用你來手動申請儲存空間,而且你的做法也是導致記憶體洩漏的典型例子,當你使用char
p=(char
malloc(32);時系統就會為你分配32個位元組,並且使p指向這個儲存空間,但當你p="hello";時,p就會指向"hello"這個儲存空間,p就不再指向那個32個位元組的儲存空間了,茄戚悉這時你的程式就再也不能利用這個32個位元組的儲存空間了。避免記憶體洩漏的做法可以是:
charp=(char
malloc(32);
free(p
/在使p指向其它的地方之前釋放掉這個多餘的空間。
p="hello";
或者:char
p=(char
malloc(32);
char*ch
p;//如果覺得這個空間還有用,可以把它交給別人幫你保管,這樣這個空間就不會變成遊魂野鬼了。
phello";
2樓:舒桂枝詩雪
相關概念。c++三種傳遞引數方式。
傳引數的值(稱值傳遞,簡稱傳值),傳引數的地鄭冊址(稱位址傳遞,簡稱為傳址),和引用傳遞(稱為傳引用),相應的函式傳值呼叫,傳址呼叫和傳引用呼叫。
形參、實參。
函式定義時參數列中的引數稱為形式引數,簡稱形參;函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞稱為形實結合。
說明。通常情況下,c++是傳值呼叫,它是單向的,只能從實參到形參。形參實質上市實參的一種拷貝,所以傳遞時不會改變外部實參的值。
引用的含義及功能。
即別名,功能主要是傳遞函式的引數和返回值。
引用的規則。
1)引用被建立的同時必須被初始化拍叢緩(指標則可以在任何時候被初始化)。
2)不能有null引用,引用必須與合法的儲存單元關聯(指標則可以是null)襲模。
3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。
例項。#include
usingnamespace
stdvoid
swap(int
x,inty)
intmain(void)inta
intbcout
aabbendlswap(a,b)cout
aabbendlsystem("pause")
return
一:值傳遞。
voidswap(int
x,inty)
inttempxx
yytemp輸出結果:a1,b
a1,b原因:swap(int
x,inty)函式採用值傳遞的方式,傳入的實參實際上是a和b的副本而非其本身,所以對副本的改變並不會反應到a和b本身上。
二:引用傳遞。
voidswap(int
x,inty)
inttempxx
yytemp輸出結果:a1,b
a2,b原因:swap(int
x,inty)函式採用引用傳遞的方式,傳入的實參實際上是a和b的引用,對引用的改變會直接反應到a和b本身上。
三:指標傳遞。
改變指標本身。
voidswap(int
x,inty)
inttempxx
yytemp呼叫方法:swap(&a,b)
輸出結果:a1,b
a1,b原因:swap(int
x,inty)函式採用指標傳遞的方式,傳入的實參實際上是a和b的指標的副本,而且改變的是副本本身而非其間接引用,所以不會影響的指標所指向的值,即a和b本身上。
3樓:網友
不要以為用指標做引數就是位址傳遞方式,因為你主函式中的p是指標,要想在函式中改變主函式中指標的值,應該以指標的指標的方式傳遞引數:
void change( char** q )
int main()
另外,在定義char* p字串,在使用之前並不是必須要用malloc(),你的程式就是乙個很好的例子,因為"hello"是乙個字串常量,所有的常量(包括其它資料型別的常量),編譯器會自動為它們分配儲存空間,不用你來手動申請儲存空間,而且你的做法也是導致記憶體洩漏的典型例子,當你使用char *p=(char *)malloc(32);時系統就會為你分配32個位元組,並且使p指向這個儲存空間,但當你p="hello";時,p就會指向"hello"這個儲存空間,p就不再指向那個32個位元組的儲存空間了,這時你的程式就再也不能利用這個32個位元組的儲存空間了。避免記憶體洩漏的做法可以是:
char *p=(char *)malloc(32);
free( p );//在使p指向其它的地方之前釋放掉這個多餘的空間。
p="hello";
或者:char *p=(char *)malloc(32);
char* ch = p;//如果覺得這個空間還有用,可以把它交給別人幫你保管,這樣這個空間就不會變成遊魂野鬼了。
p = "hello";
4樓:天蠍神經俠侶
c 語言跟 c++ 是不同的。最大的不同之處在於,它不會象變魔法般的在後臺以程式設計師不知道的方式新增一些奇奇怪怪的東西。——這可能是好事,也可能是壞事,取決於你在什麼領域進行程式設計。
乙個陣列就是一串序列,它的位址以及儲存的內容都一目瞭然在那裡了,沒有任何地方記錄了有關其「長度」的資訊。所以你自然沒有辦法知道它的長度。資訊都儲存在記憶體中,你能獲取乙個資訊就意味著這個資訊或者用來推算這個資訊的相關資訊必須被儲存在記憶體中的某個地方,你能知道乙個陣列的長度就必須有某個地方儲存了這個陣列的長度資訊。
題主要的是有某個「魔法」的方法知道乙個指標指向的內容的長度,但如果你根本沒有在任何地方儲存它的長度,沒有人知道,又如何能獲取?
所以,傳遞長度本質上來說就這麼幾個辦法,1,單獨傳乙個長度引數,(c方式),或者對資料內容進行約定(c字串方式),2,把資料包裝成乙個結構,結構中有乙個欄位是長度,另外乙個欄位是資料內容,同時在新增一些其他的欄位作為控制資訊等(c++方式)。3,其他各種黑科技,使用這些黑科技一般會造成程式不可移植,只能適用於特定場合。
5樓:網友
讓函式返回修改後的指標就可以了,比如:
char *change(char *p);
字串可以直接宣告,比如;
char *p = "hello";
c語言如何在區域性函式里,改變指標的指向
6樓:網友
1、如果函式引數直接傳遞的是指標型別,那麼在函式內改變指標指向,並不能影響函式外的指標例項。只有傳入指標的指標,才能改變指標的指向。
2、函式里的形參是一般變數,在函式里面改變變數的值,不會改變主函式里實參的值。指標就是位址變數,在函式里改變位址變數的值時,不會改變主函式實參位址變數的值。只有在函式里改變指標所指向的變數的值時 主函式實參指標所指向的變數的值才會改變。
7樓:網友
改變指標的指向 傳遞指標的引用進去。
#include
using namespace std;
typedef struct lstructls;void xy(ls *s1,ls *s2)void xy1(ls & s1,ls & s2)int main()
8樓:網友
你可以用s1->data=s2->data.但是你這程式看不大懂。
c++問題:如何通過傳入函式的方法,修改多個指標的位址
9樓:網友
將呼叫函式中 的引數改為 「引用」 就可以了。
但是要換"位址"的話,因為位址在不同的記憶體中分配的位址是不同的,所以交換位址是不行的。
10樓:o後青春
問一下 三個要怎麼個交換法啊。
c語言函式傳遞指標 為什麼函式fun無法修改指標p 應該怎麼改?(這是重點) 謝謝
11樓:網友
#include
char *fun(char *x,char *y)printf("%p %p",x,y);
x=y;printf("%p %p",x,y);
return x; //此處返回位址就可以了;
int main(void)
char s="abc";
char *p,*q;
p=null;
q=s;printf("%p %p",p,q);
p=fun(p,q); //將fun函式返回的位址賦值給p就可以了。
printf("%p %p",p,q);
return 0;
12樓:網友
你好。因為func引數是指標型別,傳入也是指標型別,所以只是一般的值傳遞。值傳遞是傳入輸入引數的拷貝。因此不能修改p的值。
改成引用模式。void fun(char* &x, char* &y)就好了。
13樓:網友
因為你改的是指標的變數,不是指標指向的內容。如果想更新傳入的指標,那就可以用指向指向的指標來修改。
void fun(char **x, char **y)
int main(void)
14樓:才那
main中第乙個printf輸出00000000 0012ff44
然後呼叫fun函式實參p為00000000,q為0012ff44,傳遞給形參,形參在棧上重新開闢一塊記憶體,是實參的拷貝副本,x=00000000,y=0012ff44,fun函式的第乙個printf輸出為。
00000000 0012ff44,然後執行x=y,此時x=0012ff44, y=0012ff44,執行第二個printf後輸出。
0012ff44 0012ff44,然後釋放fun函式,也就把fun函式的變數,包括x,y釋放,x與y只是p和q的副本,和p,q無關,p和q是main函式記憶體區的變數,只有在main函式結束後才會釋放,所以main中第二個printf輸出00000000 0012ff44
15樓:網友
c語言 本身使用值傳遞機制,也就是導致了任何情況下,形參的變化都不會影響到實參本身(c++有引用,可以解決這個問題)
此處需改為二級指標。
#include
void fun(char **x,char **y)//int main(void)
如何定義指向函式的指標
一 定義一個函式指標的方法如下 返回值型別 指標變數名 形參列表 1 int func int x 宣告一個函式 2 int f int x 宣告一個函式指標 3 f func 將func函式的首地址賦給指標f 二 函式指標的用法 函式指標的應用 指標變數名 引數列表 如 int c ptr a,b...
c語言指標和函式的問題,C語言指標和函式的問題。!
樓主你好。include int main printf 修改前,陣列元素的值 段1 print array a,5 printf 修改後,陣列元素的值 段2 change values a,5,3 print array a,5 return 0 函式功能 修改一位陣列元素的值,規則是 新值 原值...
指標陣列函式的用法
應該這樣定義 const int temp int a,int b 但是函式不能返回一個陣列.這樣也編不過.請參考 include const int fun1 int a,int b const int fun2 int a,int b typedef const int fun int a,in...