1. 程式人生 > >c++ 取地址運算 指標變數

c++ 取地址運算 指標變數

一、取地址運算子&(記憶體地址)

C++編譯的程式佔用的記憶體分為以下幾個部分:

1.棧區:由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。與其它分割槽不同,變數的地址是按照申請順序降序排列的。

2.堆區: 由new指令申請,由delete指令釋放。申請後不釋放可能會造成記憶體資源的浪費。需要指出,對於用指標申請的對記憶體空間,指標本身存入棧,指標指向的空間則儲存在堆中。

3.全域性(靜態)變數區:全域性變數和靜態(由static修飾)變數的儲存是放在一塊的。從程式開始執行時寫入變數值,執行結束前釋放變數。

4.程式程式碼區:用於存放函式體的二進位制程式碼。

另外,還有專門用於存放常量的區域。

下面編寫程式進行測試,證明以上幾種變數分割槽不同。

?
#include <iostream> using namespace std; int x,y,z; void f1(){}; void f2(){}; void main() { int a,b,c; cout<<"區域性變數的地址:"<<endl; cout<<&a<<" "<<&b<<
" "<<&c<<endl;//地址降序 int *m = new int[3], *n = new int, *l = new int, *k = new int; cout<<"指標所指向的記憶體的地址:"<<endl; cout << &(*n) << " " << &(*l) << " " << &(*k) << endl;//指標本身存入棧,地址降序 cout<<
"指標指向空間的地址:"<<endl; cout <<&(m[0])<< " " <<&(m[1])<< " " <<&(m[2])<< endl; static int w; cout<<"全域性(區域性)變數的地址:"<<endl; cout<<&x<<" "<<&y<<" "<<&z<</*" "<<&w<<*/endl; cout<<"函式程式碼的地址:"<<endl; cout<<&main<<" "<<&f1<<" "<<&f2<<endl; }

程式執行結果:

clip_image002

由程式執行結果可以看出:

1. 四種變數的地址相互相差很大,而本身相差很小,說明被分配在了不同的記憶體空間。

2. 指標和變數的地址是降序排列的,說明被分配在了棧區。

3. 全域性變數和區域性變數的地址相鄰,說明二者被安排在了同一分割槽。

注意:不要把取地址運算子&和應用運算子&搞混,前者放在變數定義中的變數的前面,而後者放在函式原型定義中的型別名後面。

二、指標變數

我們要想更好的利用上面提到的地址,就必須設定一個變數來儲存地址。像用變數來儲存int、float等型別的值一樣,地址也可以用類似的方法儲存。

定義:用來儲存地址的變數叫做指標變數(pointer variable)或者簡稱指標。

如:int* ptr;星號表示指向誰,這個宣告定義了一個指向整型資料的指標變數。這個變數中儲存整型資料的地址:ptr=&variable;

1) 訪問指標指向的變數。

*ptr就表示了ptr中的地址上儲存的值。變數名前面的星號表示間接引用運算子(dereference operator)或者叫做取內容運算子(contents operator)。

2)void指標

指標儲存的變數必須和指標的型別保持一致,如不能將一個float型別的地址賦給一個指向int的指標。

相關推薦

c++ 地址運算 指標變數

一、取地址運算子&(記憶體地址) C++編譯的程式佔用的記憶體分為以下幾個部分: 1.棧區:由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。與其它分割槽不同,變數的地址是按照申請順序降序排列的。 2

C語言程式設計_指標變數的定義和使用

指標變數的定義和使用 定義:存放北村地址的變數 int *(變數型別:整形指標)p = NULL(初始值:NULL恆等於0); *p 在指標變數定義時 只起修飾作用,告訴編譯器p是指標 *p 在指標變數取值時 訪問記憶體地址為p的儲存區域 指標變數所佔位元組數只與作業系統有

C++中指標和引用的區別、以及引用和地址符&的區別

一. 指標和引用的區別 對於指標來說,它是一個地址,這個地址是一個數值,那麼就意味這個數值可以為0(空指標),也可以為其他,即指標可以不指向任何東西。 而對於引用來說,他是一個外號,外號一定是“某個存在物體”的外號,所以引用不能為空,即不能存在空引用。例如我們給小明起了個外號:明明,那我們說

C語言 指標 詳解 二 C語言指標變數運算

指標變數儲存的是地址,本質上是一個整數,可以進行部分運算,例如加法、減法、比較等,請看下面的程式碼: #include <stdio.h>int main(){ int a = 10, *pa = &a, *paa = &a;

c++中的簡單逗號表示式和指標地址運算子優先順序的示例

int *p1, *p2; int a = 10; int b = 20; p1 = &a; /////////////////////////////////////////////

c語言中const 型別變數地址賦值給指標

const在C語言中是表示道義上保證變數的值不會被修改,並不能實際阻止修改,通過指標可以修改常變數的值,但是會出現一些不可知的結果。幾種情況不同,我們一個一個來看。 1、直接賦值 const int a = 3; a = 5; // const.c:6:2: error: assignment of read

C語言輸出指標變數地址以及指向變數地址

#include <stdio.h> #include <stdlib.h> int main() { int a = 100; int *ap = &a

c語言 指標變數運算

指標變數儲存的是一個地址,本質上是一個整數,可以進行部分運算.例如加法、減法、比較等  #include <stdio.h> int main(){     int a=10, *pa=&a, *paa=&a;     double b=99.9

C++ 從函式返回指標(函式外返回區域性靜態變數地址

C++ 不支援在函式外返回區域性變數的地址,除非定義區域性變數為 static 變數。 錯誤程式碼: int main(){ int *p; p=funcGetPointer()

C/C++【初級】之一 指標(*)、地址(&)、解引用(*)與引用(&)的概念

1.引用注意事項: 1.引用必須被初始化; 2.引用一旦與初始值物件繫結,就不會變化(引用從一而終)!!! 3.引用初始值必須為一個物件,不能使常數 4.引用必須與被引用的物件型別一致 示例1: /*———————————————————

球問題--c語言邏輯運算的短路特性

寫法 取出 編程 main highlight out 小球 ret log 今盒裏有n個小球,A、B兩人輪流從盒中取球。每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個。兩人都很聰明,不會做出錯誤的判斷。 每個人從盒子中取出的球的數目必須是:1,3,7或者8

指標變數運算

/*指標變數的運算: 指標變數不能相加,不能相乘,不能相除; 如果兩個指標變數指向的是同一塊連續空間中的不同儲存單元,則這兩個指標變數才可以相減;*/ #include <stdio.h> int main(void){   int a[5];   int * i = &a[2];  

c++中普通變數,引用變數指標變數用例項讓你親自體會

int a1 = 10; int a2 = 20; int a3 = a1;//賦值語句,可以理解成資料的克隆,a3與a1 不在是指向一個物件 int &b = a1; //int &b2 = 900; //不合法,非常量引用的初始值必須左值 int *c =

關於Qt動態載入dll時,函式指標地址OK,使用時卻有問題

碰到如題所述的問題,很尷尬,有些庫函式可以正常使用,而有些一用就game over。還以為是庫有問題。 呼叫介面函式時,崩掉??? 根據網上同仁給出的解決方法,是在定義函式指標型別時新增一個_stdcall。但也存在一個缺陷,只能在Windows平臺上幫助解決問題。如下所示 typedef

c++指標變數(一)

通過指標,可以簡化一些C++程式設計任務的執行,還有一些任務,如動態記憶體分配,沒有指標是無法執行的。每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可以用&運算子訪問地址,它表示了在記憶體中的一個地址。 什麼是指標:       指標是一個變數,

C++中指標指標變數

指標和指標變數的理解: #include<iostream> using namespace std; int main() { int n; int * m; m = &n; n = 10; cout << "n=:" <

C/C++陣列指標指標陣列、函式指標變數的宣告和用法

#include <iostream> using namespace std; void fun1(int(*pArr)[3], int row) { int i,j; for (i = 0; i < row; i++) { for (j = 0; j <

C語言基礎 指標變數的定義與使用

---------------start reading--------------- 前言: 指標變數是C語言基礎中的重要模組,但指標的定義與使用卻常常混淆,分不清,今天,我們就來梳理一下指標的定義和使用方法 (1)(2):定義變數並將其賦值 (3):定義一

C 判斷 —— if...else 語句(bool變數、float變數指標變數與“零值”進行比較)(else 到底與哪個 if 配對呢? if 語句後面的分號?)

1、bool 變數與“零值”進行比較 bool 變數與“零值”進行比較的 if 語句怎麼寫? bool bTestFlag = FALSE;//想想為什麼一般初始化為 FALSE 比較好? A), if(bTestFlag == 0); if(bTestFlag == 1

結構體的初始化和引用及指向結構體變數指標變數C語言)

一、首先我們來了解關於結構體以及結構體陣列的概念。 自定義結構體: struct weapon{ char name[20]; int atk; int price; }; 它是"weapon"型(類似於我們熟知的int型,String型等),裡