C 中指標詳解(一些困惑的回答)

2021-08-16 20:10:55 字數 2446 閱讀 5552

本文篇幅比較長,我盡量以生動的口吻來跟大家說清楚,相信讀者如果能通讀全文,一定會解決一些困惑或者有一些啟發:

一、談到指標,首先什麼是指標?這裡引用幾個常見書目的定義:

1、指標是乙個變數,儲存的是值的位址,而不是值本身    ——《c++ primer plus》

2、就像其他變數一樣,指標變數也有名稱,而且指標還有型別,以指出其內容引用的是什麼型別的變數  ——《visual c++入門經典》

3、指標是c語言的乙個重要特性,它提供了引用資料結構(包括陣列)的元素的機制  ——《深入理解計算機系統》

同時對於指標究竟是什麼,在網上也有著很多的爭議:知乎:指標究竟是什麼?

其實,我們可以「簡單」的說指標是一種變數,是一種用來儲存位址的變數。(顯然這一定義是不確切的)

2、指標的型別:指標所指向物件的型別

二、與其說關心指標是什麼,其實我們更關心指標的用法,也就是說怎麼使用指標(說完了什麼是指標按照邏輯我們應該聊一聊為什麼要使用指標,但是這一點在這裡留一點懸念,因為單純的告訴你為什麼其實你的印象不會深刻,我們在後面的例子裡會對指標的使用有乙個列舉,想必看完例子之後,各位對於為什麼使用指標都會有乙個比較籠統的概念了。)

首先是指標的定義:對於指標的定義,其實寫法有很多,這一點在《c++ primer plus》中有非常詳細的乙個敘述,常見的寫法有下面三種,分別是:

int* p

int *p

int*p

這些都是指標的宣告,其實很多人一直會認為第一種和第二種寫法有著疑惑,這兩種寫法是否有不同呢?其實對於編譯器來說,沒有任何不同,甚至連沒有空格的第三種寫法,編譯器都能正確識別出,但是個人更推薦第一種寫法,這種寫法強調的是:該變數的型別是(指向int型別的指標),這種寫法會讓讀者在讀取**時有乙個更加清晰的理解。

因為指標的特性,這一點在《c++ primer plus》有著非常詳細的案例,這裡我們選擇性的引述:

「c++中建立指標的時候,計算機將分配用來儲存位址的記憶體,但是不分配用來儲存指標所指向的資料的記憶體」

好像有點複雜,我們舉乙個例子就清晰多了:

long* p//宣告指標,系統給指標變數分配一塊記憶體

*p=1200 //給指標指向的物件賦值(解引用賦值)

問題顯而易見,1200存在**?我們並不知道,我們只知道是p儲存著它的位址,這時就產生了空指標,要知道,乙個我們不知道且不可控的指標還可以直接訪問位址是一件多麼恐怖的事情,所以,我們需要對指標進行初始化!通常初始化可以寫成如下幾種:

int *p = null

int *p=0

但是在c++中我們推薦使用

int* p
這裡另註一點:我們經常看到都使用字母p作為指標是一種慣例,我們在寫程式時也應當盡量遵守這一慣例。

int* p;  //宣告指標變數p

p=&object //取object的位址存入指標變數

#include using namespace std;

int main()

; int choice = 0;

cout << "please input a number between 1 to 6:" << endl;

cin >> choice;

if (choice >= 1 && choice <= 6)

else

system("pause");

return 0;

}

好,我們說了那麼多陣列的不好,再用指標試一試,顯然,使用指標之後清爽了很多,我們不用再去考慮內容在陣列中是怎麼儲存的,我們直接給要儲存的內容分配乙個指標,指向首位址,用的時候呼叫指標就好了,當然這種做法很簡單明瞭,但是如果遇到儲存個數較多時,我們顯然不可能給每乙個內容都分配乙個指標,那有沒有更好的解決方法呢?:

#include using namespace std;

int main()

system("pause");

return 0;

}

顯然是有的,我們在引入乙個概念-指標陣列,這也是我們日後最為常用的,話不多說,直接上**:

#include using namespace std;

int main()

; int choice = 0;

cout << "please input a number:" << endl;

cin >> choice;

if (choice>=1&&choice<=6)

else

system("pause");

return 0;

}

好了,三種方法一比較,我們很明顯的可以區分出孰優孰劣。

指標的使用其實還有很多,篇幅所限,這裡我們只對於一些日常困惑的問題做乙個生動的解釋或者說是描述

C語言中指標的一些易錯點!

先看個例子 include int main char str hello int len strlen str int i 直接輸出字串 printf s n str 使用 str i for i 0 i 最根本的區別 記憶體中的儲存區域不一樣,字元陣列儲存在全域性資料區或棧區,第二種形式的字串儲...

C語言中指標的一些概念及用法

在學習資料結構的鍊錶結構時,經常用到指標的概念。下面簡要說一下其中的概念 在被調函式中如果想要回傳某些引數,則要用到指標才可以。具體做法是 你要改變某個量,則在引數傳遞時傳入該量的位址 例如 void initiallist node pl 初始化鍊錶 在本例中,改變頭指標變數 node 指向頭結點...

使用james的一些困惑

自己搭建的james伺服器,一切皆如普善園的博文 在本機上接受,傳送一切正常。測試程式是用的spring對mail的支援 import org.springframework.mail.public class testmail localhost true 25000 jkfzero jkfzer...