中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++中的指針的應用及注意問題是什么

發布時間:2021-11-30 15:54:27 來源:億速云 閱讀:116 作者:iii 欄目:編程語言

本篇內容介紹了“C/C++中的指針的應用及注意問題是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、我們先來回憶一下指針的概念吧,方便下面的介紹

指針是存放地址值的變量或者常量。例如:int a=1;&a就表示指針常量(“&”表示取地址運算符,也即引用)。int *b,b表示的是指針變量(注意,是b表示指針變量而不是*b),*表示要說明的是指針變量。大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一個指針數組,而int (*b)[2]表示含有兩個元素的int指針,這里要注意運算優先級問題,有助于理解指針問題。在這里大概介紹基本概念就夠了,至于具體使用方法,如賦值等,很多書都有介紹,我就不多說了。

二、應用以及注意的問題

1、 理解指針的關鍵所在——對指針類型和指針所指向的類型的理解

①、 指針類型:可以把指針名字去掉,剩下的就是這個指針

例如:int *a;//指針類型為int *

int **a;//指針類型為int **

int *(*a)[8];//指針類型為 int *(*)[8]

②、 指針所指向的類型:是指編譯器將把那一片內存所看待成的類型。這里只要把指針聲明語句中的指針名字和名字右邊的“*”號去掉就可以了,剩下的就是指針所指向的類型。我之所以把他們放在***位,是因為弄清楚他們是學c/c++指針的重點,正確理解他們才能使你打好c/c++的編程基礎。

2、 指針的應用——傳遞參數。

其實它可以相當于隱式的返回值,這就比return的方法更加靈活了,可以返回更多的值,看看下面的例子自然就明白了:

#include "iostream.h"  void example(int *a1,int &b1,int c1)  {  *a1*=3;  ++b1;  ++c1;  }  void main()  {  int *a;  int b,c;  *a=6;  b=7;c=10;  example(a,b,c);  cout 《"*a="《*a<  cout 《"b="<  cout 《"c="<  }

輸出:*a=18

b=8

c=10

注意到沒有,*a和b的值都改變了,而c沒有變。這是由于a1是指向*a(=6)的指針,也即與a是指向同一個地址,所以當a1指向的值改變了,*a的值也就改變了。在函數中的參數使用了引用(int &b1),b1是b的別名,也可以把它當作特殊的指針來理解,所以b的值會改變。函數中的參數int c1只是在函數中起作用,當函數結束時候便消失了,所以在main()中不起作用。

3、 關于全局變量和局部變量的一個問題

先看看程序:

#include “iostream.h”  int a=5;  int *example1(int b)  {  a+=b;  return &a;  }  int *example2(int b)  {  int c=5;  b+=c;  return &b;  }  void main()  {  int *a1=example1(10);  int *b1=example2(10);  cout 《”a1=”《*a1<  cout 《”b1=”《*b1<  }

輸出結果:

a1=15

b1=4135

*b1怎么會是4135,而不是15呢?是程序的問題?沒錯吧?由于a是全局變量,存放在全局變量的內存區,它一直是存在的;而局部變量則是存在于函數的棧區,當函數example2調用結束后便消失,是b指向了一個不確定的區域,產生指針懸掛。

下面是對example1和example2的反匯編(用TC++ 3.0編譯):

example1:

push bp;入棧

mov bp,sp

mov ax,[bp+04];傳遞參數

add [00AA],ax;相加

mov ax,00AA ;返回了結果所在的地址

pop bp;恢復棧,出棧

ret;退出函數

example2:

push bp;入棧

mov bp,sp

sub sp,02

mov word ptr [bp-02],0005

mov ax,[bp-02];傳遞參數

add [bp+04],ax;相加

lea ax,[bp+04];問題就出在這里

mov sp,bp

pop bp;恢復棧,出棧

ret;退出函數

對比之后看出來了吧?ax應該是存儲的是結果的地址。而在example2中,返回的卻是[bp+04]的內容,因此指針指向了一個不確定的地方,由此產生的指針懸掛。example1中,ax返回了正確的結果的地址。

4、 內存問題:使用指針注意內存的分配和邊界

使用指針過程中應該給變量一個適當的空間,以免產生不可見的錯誤。

請看以下代碼:

#include “iostream.h”  void main()  {  char *a1;  char *a2;  cin 》a1;  cin 》a2;  cout 《”a1=”<  cout 《”a2=”<  }

輸入:abc

123

輸出:

a1=123

a2=

Null pointer assignment

指針指向了“空”。解決辦法就是分配適當的內存給這兩個字符串。修正后的代碼

如下:

#include “iostream.h”  void main()  {  char *a1;  char *a2;  a1=new char [10];  a2=new char [10];  cin 》a1;  cin 》a2;  cout 《”a1=”<  cout 《”a2=”<  delete(a1);//注意,別忘了要釋放內存空間  delete(a2);  }

到此就能輸出正確的結果了。分配了適當的內存之后要注意釋放內參空間,同時還應該注意不要超出所分配的內存的大小,否則會有溢出現象產生,導致不可預料的結果。

5、 關于特殊的指針&mdash;&mdash;引用

引用有時候應用起來要比指針要靈活,用它做返回的時候是不產生任何變量的副本的這樣減小了內存的占用,提高執行的速度。引用使用起來要比指針好理解,比較直觀。當引用作為參數時,不會改變參數的地址,因此可以作為左值。

下面請看一個例子:

#include “iostream.h”  char ch[5]=”ABCD”;  char &example(int b)  {  return ch;  }  void main()  {  cout 《”ch=”<  example(2)=”c”;  cout《”ch=”<  }

輸出結果:

ch=ABCD

ch=ABcD

在實際編程過程中,可以靈活地引用或指針,盡量提高程序的可讀性和執行效率。

“C/C++中的指針的應用及注意問題是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

襄汾县| 大邑县| 平昌县| 南乐县| 启东市| 耿马| 宣汉县| 钦州市| 望江县| 尉犁县| 象州县| 玉龙| 亳州市| 桂林市| 崇信县| 和林格尔县| 洛扎县| 漾濞| 吴桥县| 喀喇| 平利县| 札达县| 普兰县| 黄平县| 鹰潭市| 盘锦市| 娱乐| 广元市| 汨罗市| 嘉祥县| 寿阳县| 深水埗区| 文昌市| 讷河市| 固原市| 太康县| 绥滨县| 罗山县| 五峰| 京山县| 新河县|