1. 程式人生 > >C++中的指標問題(一)

C++中的指標問題(一)

  • 在C++語言中指標是個非常重要又神奇的東西,搞懂指標就非常的重要。下面首先介紹一下指標的基本作用:
    指標是對某一型別資料(可以是int、char、string、double以及結構或類……)的間接使用。指標本質是儲存變數的地址。其表示符號為” * “,此符號表示指標(也可以把指標當作是與int等相同的一種變數型別)。具體以下面的例子說明:
//……此處省略預處理……
int i = 5;
int* p;     //p是一個int型的指標,或者說p是一個指向int型的指標
cout << &i; //這裡是輸出i的地址
//剛剛說過指標是用來儲存一個變數的地址的,這裡可以將指標p用來儲存變數i的地址:
p = &i; //把變數i的地址賦值給p cout << p; //這裡同樣是輸出變數i的地址,與前面的cout<< &i一樣,如果要通過指標輸出i的內容則需要加上*(指標) cout << *p; //這裡輸出的是i的內容5,和cout<<i等效

指標的另一個作用就是可以通過指標來間接改變源地址中的內容,比如下面的程式碼片段,我想通過指標來改變一個整形數的值:

int i = 5;   //原來的i的值
int* p;
p = &i;      //這裡採用的是先定義指標p然後給指標p賦值,也可以定義的同時就賦值:
//int* p = i; //注意:這裡的賦值不再是&i了,因為p前面有個*號,這代表著給p所表示的地址賦值即i的值賦給p
*P = 8; //通過指標將p所儲存的地址的內容改為8 cout << i; //此時輸出為8

這裡需要注意的是,要通過指標p改變變數i的值,則必須用*p,而不能用 p = 8,這樣表示的是指標p儲存的地址為8會產生編譯錯誤。

此外,指標也可以用於指向陣列變數,但與其他變數不同的是,當指標用於指向陣列變數時(儲存陣列變數的地址時),賦值如下:

int a[5] = {1, 2, 3, 4, 5};
int* p;
p = a; //這樣就相當於將陣列a的首地址給了p,而不是 p = &a
//這裡也可以通過指標輸出數組裡的其他值
cout << *(p + 2); //輸出a[2]的值,也可利用for迴圈全部輸出
for(int i = 0; i < 5; i++) cout << *(p++) << endl;
  • 指標的所佔空間大小的問題。不論資料型別是int,char,float還是double型別,其指標均佔4Byte空間,但若測量具體值時,則視相應型別有不同。例如:
int* p;
char* i;
double* q;
float* j;
cout << sizeof(p) << endl; //輸出4
cout << sizeof(i) << endl; //輸出4
cout << sizeof(q) << endl; //輸出4
cout << sizeof(j) << endl; //輸出4
int a = 5;
p = &a;
char b = 'a';
i = &b;
double c = 5.5;
q = &c;
float d = 5.5;
j = &d;
cout << sizeof(*p) << endl; //輸出4
cout << sizeof(*i) << endl; //輸出1
cout << sizeof(*q) << endl; //輸出8
cout << sizeof(*j) << endl; //輸出4

如有錯誤,歡迎大家批評與指正!

相關推薦

C++ 智慧指標

  記憶體安全     在C++中,動態記憶體的管理是通過一對運算子來完成的:new,在動態記憶體中為物件分配空間並返回一個指向該物件的指標,我們可以選擇對物件來進行初始化;delete,接收一個動態物件的指標,銷燬該物件,並釋放與之關聯的記憶體。   動態記憶體的使用很容易出問題,因為確保

C++智慧指標智慧指標的簡單介紹

C++智慧指標 在正式瞭解智慧指標前先看一下下面的一段程式碼 #include<iostream> using namespace std; class A { public: A() :_ptr(NULL), _a(

C語言指標

指標與地址 一元運算子&可用於取一個物件的地址,地址運算子&只能應用於記憶體中的物件,即變數與陣列元素。不能作用

C++設計技巧之兩個類互相擁有對方的物件指標

1、在實際的運用中我們也會用到如下的類關係: class B; class A { int i; B *lpb; } class B { int i; A* lpa; } 注意:一般來說,兩者的定義,至少有一方是使用指標,或兩者都使用指標,但是決不能兩者都定義實體物件。 這樣的實

C++複習筆記:書籍《C++程式設計》譚浩強版更新。。。

簡單的C++程式例子 #include <iostream> using namespace std; // main() 是程式開始執行的地方 int main() { cout << "Hello World"; // 輸出 Hello World

Linux C程式設計--陣列與指標

1.1陣列的基本概念及其定義    在程式設計中,為了方便處理,把具有相同型別的若干變數按有序的形式組織起來。這些按序排列的同類資料元素的集合稱為陣列。(1)對於同一個陣列,其所有元素的資料型別都是相同

c# 進程

for 定義 blog 調用 image method 程序 leg pri 1、進程,進程和多線程的概念: 進程:一個程序運行時所有資源的統稱。 線程:每一個響應執行流就是線程。(做不同的事情) 多線程:多個線程同時工作 2、同步和異步的概念: 同步:前面的先執行,後面的

C++sizeofstruct怎麽計算?

color 發現 pre blank str io7 bsp com 說明 struct為空時,大小為1. 1、 sizeof應用在結構上的情況 請看下面的結構: 1 struct MyStruct 2 { 3 double dda1; 4 char dda; 5 int

讓我們把KBEngine玩壞吧!如何定制我們自己的C++函數

data ase erro glob alt ins sin 程序 all 為什麽不更新kbe warring的代碼解讀了,因為在我看來那個demo講完了實體就沒東西可講了,如果專心的看官方文檔和PPT的話demo的代碼後面沒任何難點了已經,單純的復制黏貼代碼實在太過無聊。

C# SQL封裝

c# sql封裝(一)感謝軟謀徐老師的SQLHelper.as , 代碼如下(本人有所改動):using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using

C++引用&的用法和應用實例

發的 高效 結果 特殊情況 副本 推薦 全局變量 對象的引用 間接 對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高代碼執行效率和增強

C#編程

暫停 ole console 文檔 tle key javascrip 字符 多行 第一個簡單的C#程序 using System; using System.Collections.Generic; using System.Linq; using System.Text

設計模式學習筆記 C#代碼

內容 編程 繼承 color 模式 c# 派生類 ive spa 《深入淺出設計模式》學習筆記第一章 原始需求和設計 事情是這樣開始的,公司需要做一套程序,鴨子,設計如下: 一個鴨子父類,多個派生類,三個可override的方法。 第一次需求變更 我們要會飛的鴨子!!!!

C++學習心得

eof gpo pre typeid 學習 div ctrl+z c++ str 2018-01-20 while (cin >> n)//終止可以使用輸入eof或Ctrl+Z for (auto &c : str) cout <

C++學習筆記——一個字符串分割和統計的工具TextUtils

發生 插入 exit 大小 按行讀取 位置 n) fstream ostream 第一講先從一個實例開始——我們需要完成一個遍歷文件並統計單詞出現次數的任務。分解功能:首先,按行讀取文件並舍棄可能的空行。其次,將每一行都按照空格劃分單詞。因為可能存在標點符號,我們還需要將標

CC++ 的升級

C++ C 到 C++ 升級 struct 我們之前學習了那麽多的 C 語言相關的知識,其實 C 語言是在實踐的過程中逐步完善起來的。C 語言在設計之初就是對 B 語言進行改良,使其能夠直接產生機器碼,C 語言由此誕生。後來 Unix 操作系統開始用 C 語言重寫,同時 C 語

C#重寫override和覆蓋new的區別

實現 div del end 抽象方法 ring reg strong AR 重寫 用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。

C# 詞法分析器詞法分析介紹

art 優化 不一定 clr gen 多個 scan 原理 輸入緩沖 系列導航 (一)詞法分析介紹 (二)輸入緩沖和代碼定位 (三)正則表達式 (四)構造 NFA (五)轉換 DFA (六)構造詞法分析器 (七)總結 雖然文章的標題是詞法分析,但

C++語言學習——C++簡介

產品 泛型 alt 科學計算 內容 實現 .com 運算符 ces C++語言學習(一)——C++簡介 一、C++簡介 C 語言作是結構化和模塊化的語言,適合處理較小規模的程序。對於復雜的問題,規模較大的程序,需要高度的抽象和建模時,C語言並不合適。為了解決軟件危機, 20

詳解C#泛型

安全 情況 重用 模板 信息 普通 cast 綁定 封閉式   一、C#中的泛型引入了類型參數的概念,類似於C++中的模板,類型參數可以使類型或方法中的一個或多個類型的指定推遲到實例化或調用時,使用泛型可以更大程度的重用代碼、保護類型安全性並提高性能;可以創建自定義的泛型類