簡述一下二級指標以及指標的引用在結構體中用法

2021-06-29 07:03:25 字數 4547 閱讀 3705

我一下討論的都是在不用return把值進行返回的情況, 也就是說用指標的情況。

很簡單就是指標和引用,引用在新版本的c裡面也有包含,可以使用。

系統xp+ide用的 vc6.0:

要把乙個值通過呼叫函式改變,可以用指標和引用,這個值可以是int int *,char char*,或者說是結構體,結構體也有不同的情況,比如說,

結構裡面有結構體指標和沒有的情況,這裡我將就我的經歷寫一下。

先看看人家的比較好的說法:

void func1( myclass *&pbuildingelement );

仔細看一下這種宣告方式,確實有點讓人迷惑。在某種意義上,"*"和"&"是意思相對的兩個東西,把它們放在一起有什麼意義呢?。為了

理解指標的這種做法,我們先複習一下c/c++程式設計中無所不在的指標概念。我們都知道myclass*的意思:指向某個物件的指標,此物件的型別為

myclass。 void func1(myclass *pmyclass);  

例如: myclass* p = new myclass;

或者你也可以用malloc函式在c下面申請一片記憶體位址。

func1(p);

上面這段**的這種處理方法想必誰都用過,建立乙個myclass物件,然後將它傳入func1函式。現在假設此函式要修改pmyclass: void

func1(myclass *pmyclass)

第二條語句在函式過程中只修改了pmyclass的值。並沒有修改呼叫者的變數p的值。如果p指向某個位於位址0x008a00的物件,當func1返

回時,它仍然指向這個特定的物件。(除非func1有bug將堆弄亂了,完全有這種可能。)

現在假設你想要在func1中修改p的值。這是你的權利。呼叫者傳入乙個指標,然後函式給這個指標賦值。以往一般都是傳雙指標,即指標

的指標,例如,cmyclass**。 myclass* p = null;

func1(&p); 

void func1(myclass** pmyclass); 

呼叫func1之後,p指向新的物件。

如果你理解指標的指標,那麼你肯定就理解指標引用,因為它們完全是一回事。如果你象下面這樣宣告函式:

void func1(myclass *&pmyclass); 

其實,它和前面所講得指標的指標例子是一碼事,只是語法有所不同。傳遞的時候不用傳p的位址&p,而是直接傳p本身:  

myclass* p = null; 

func1(p);  

在呼叫之後,p指向乙個新的物件。一般來講,引用的原理或多或少就象乙個指標,從語法上看它就是乙個普通變數。所以只要你碰到*&

,就應該想到**。也就是說這個函式修改或可能修改呼叫者的指標,而呼叫者象普通變數一樣傳遞這個指標,不使用位址操作符&。

下面是我的程式設計經歷,也可以算是經驗吧:

接著我們對int 和 結構體的情況討論,一般char的都是處理字串很簡單的。

要改變值可以如下,指標和引用:

一般的對int改變值其實可以就可以只用乙個*,用兩個指標和引用就是為了加強理解,我門看看:

下面的是用指標的測試函式

1:void function(int *ref)  //單指標的改變值的函式

int main()   //測試函式,main();

當然了main函式也可以這麼設計:

int main()   //測試函式,main();

2:下面給出雙指標的使用方法:

void function(int **p)  //雙指標的函式

int main()   //測試函式,main();

看完了指標就看引用了,&這個符號是乙個二義符號,不可以認為是取位址的。

看函式:

3:void function(int &refval)

int main()

4:再看指標的引用:其實指標的引用可以理解成雙指標,只是其位址式p而不是*p,呵呵。

看這個程式:程式比較多呵呵

#include

#include

void function(int *&ref)

int main()

//這裡也有點研究的必要,如果像下面這個給出main函式:

int main()

編譯通過不了的,很簡單,指標的引用其實本質應該式雙指標,上面的main中的值是給單指標的賦值,顯然也是不可以的。錯誤提示如下:

d:/hehe/hehe/yinyong/yin.cpp(22) : error c2664: 'function' : cannot convert parameter 1 from 'int *' to 'int *& '

對於結構體,有兩種情況,一種就是結構體裡面沒有結構體指標的,要傳值或者說要通過呼叫函式改變他的值,就像上面的int型的使用方法,

這裡就只說說其中的初始化,改變值是一樣的:

先給定結構體:

typedef struct stack st,*ls;

開始已經說了,不用return方法,就用傳值的方法:

1:如果在main函式裡面定義成:st list;那麼初始化就是:這裡應該知道,變數的引用就是變數的單指標一樣。

void set(st &list)

結構體定義:st list;

函式呼叫是:

set(list);

2:如果在main函式裡面定義成:st *list;那麼初始化就是:

void set(st *list)

結構體定義:st list;

函式呼叫是:

set(&list);

或者:結構體定義:st *list;

函式呼叫是:

set(list);

這種情況我覺得不要使用指標的引用。

另外一種就是結構體裡面還有結構體指標,如下定義結構體:

typedef struct stack st,*ls;

初始化的方法有幾種,跟宣告變數有關:

1:雙指標法:

void init(st **head)

宣告結構體變數的時候,一般這麼定義,

st *head;

呼叫函式的時候這麼用:

init(st &head);

2:單指標法

這個方法要使用到返回傳值,我們不研究,當然了寫一下:

st *initializelist(st  *plist)

3另一種雙指標法

其實這種只是在定製結構體型別的時候把st定義成了*ls,然後用ls來定義結構體。

如下:void initializelist(ls  *plist)

宣告結構體變數的時候,一般這麼定義,

st *head;

或者ls head;

呼叫函式的時候都是這麼用:

initializelist(&head);

這裡我要說的,其實在初始化和使用的時候跟雙指標乙個樣子的,使用的是*p而不是p,把他的位址賦值給其他的結構體的時候也要用*plist,

具體的可以看下面的程式;

struct film

;typedef struct film item;

typedef struct node

node;

typedef node * list;

bool additem(item item, list  * plist)

return true;}4:

最後了,就是指標的引用來初始化內含結構體指標的結構體:

void initializelist(st  *&plist)

這裡其實跟上面講到的指標的引用是一樣的,跟雙指標差不多,但是使用的時候用plist,plist->next而不是*plist,(*plist)->next。

宣告結構體為:

st  *plist;

呼叫函式:

initializelist(plist);

到此,我所遇到的一些指標和指標的引用都列舉出來了。有什麼不對,大家可以指點一下哈。 

下面是我的乙個指標的引用的具體的程式可以通過:

#include

#include

#define null 0

typedef struct linknode

listack;

void initstack(listack *&s)//初始化

void clear(listack *&s)

}int length(listack *s)

return i;

}int empty(listack *s)

void push(listack *&s,char e)

int pop(listack *&s,char e)

int gettop(listack *&s,char e)

void display(listack *s)

puts("");

}int main()

puts("");

printf("戀棧為%s/n",((empty(s))?"empty":"no empty"));

printf("delete the stack/n");

clear(s);

return 0;

}

一級指標二級指標

例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...

一級指標與二級指標

如下圖所示,整型指標xptr指向變數x的位址。原始碼 include int main 實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。原始碼 include include int main printf n return 0 執行結果 實現方法二 如下圖所示,先為二級整型指標pt...

一級指標和二級指標

通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...