c++指針

指針究竟是什麼

  • 指針是一類特殊的變量,他保存的不是一般數據的值,而是程序中另一對象在內存中的地址我們先通過一個小程序看一看指針如何工作
#include <iostream>
using namespace std;
int main(){
	int n = 123,m = 456;
	int *p = &n;
	cout<<"&n:"<<&n<<endl;
	cout<<"&p:"<<&p<<endl;
	cout<<" p:"<<p<<endl;
	cout<<"*p:"<<*p<<endl;
	return 0;
}

在這裏插入圖片描述
從運行結果可以看出下面幾點:

  • p本身是有一個地址的且地址爲 &p
  • p的值是另一個變量n的地址 &n
  • *p所表示的意思是地址爲 p 的內存中所存的值 n
  • 即本段程序中共涉及到2個地址,一個是 n 的地址,一個是 p 的地址,我們用一張圖來表示他們的關係
    在這裏插入圖片描述

指針的初始化

  • 被具有相同類型的對象初始化
int i = 10;
int *p = &i; 
  • 由另一個同一類型的指針初始化,這時兩個指針指向同一地址空間
int *p1 = p;
  • 通過直接分配內存地址得到初值
bashint *p2 = new int;
  • 指針也可以沒有類型,通用指針的定義,這樣的指針可以指向任一對象
void *p3

指針的運算符定義指針的目的事通過指針變量間接的訪問變量

  • * :取指針值運算符。通過指針所指內存單元的地址間接的訪問對應的存儲單元。若指針變量p指向變量a,則 *p的運算結果爲變量a的值
  • &:取地址運算符。返回變量對應的存儲單元地址,若a爲int變量,p爲int型指針變量,則 p = &a表示將a的存儲單元地址賦給p。用一個程序驗證一下:
#include <iostream>
using namespace std;
int main(){
 int a = 100;
 int *p,*p1,*q;
 p = &a;
 p1 = p;
 q = NULL;
 cout<<"a="<<a<<","<<"*p="<<*p<<","<<"p="<<p<<endl;
 *p1 = 200;
 cout<<"a="<<a<<","<<"*p="<<*p<<","<<"p="<<p<<endl;
 cout<<"*p1="<<*p1<<","<<"p1="<<p1<<endl;
}
  • 運行結果
    在這裏插入圖片描述

指針與數組的關係

  • 數組名和指針在引用數組元素和取他們的地址方面可以相互轉換,但兩者有一個重要的不同點- 數組是在定義時就分配好內存空間的,因此數組名是一個地址常量,在程序中不能將數組名作爲變量爲其賦值,而指針是一個變量,可以多次賦值我們通過一個程序看一下他們的關係
#include <iostream>
using namespace std;
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *pa = a;
int i = 3;
cout<<"a[i]   :"<<a[i]<<endl;
cout<<"*(pa+i):"<<*(pa+i)<<endl;
cout<<"*(a+i) :"<<*(a+i)<<endl;
cout<<"&a[i]  :"<<&a[i]<<endl;
cout<<"a+i    :"<<a+i<<endl;
cout<<"pa+i   :"<<pa+i<<endl;
 
}
  • 運行結果

在這裏插入圖片描述

易重要的和易混淆的概念

  • 爲什麼要對指針初始化?
    定義了指針變量後,系統會爲其分配一個內存空間,若沒有賦值則此內存區域的內容是隨機的,也就是指針隨機指向一個內存單元。你想想如果你對一個隨機的內存空間進行寫操作,會怎樣!
  • 指針的運算
    指針 + 整數 = 指針
    指針 - 指針 = 整數 //同類行的指針相減表示兩個基類型變量的個數
    指針 + 指針 = ???? //不可以
  • new、 new[]、 delete、 delete[]有什麼區別
int *p = new int(3) // 爲p分配了一個整形變量的存儲區域並初始化爲3
int *p1 = new int[20] // 分配20個整形變量的區域給p
1delete p //釋放有new申請的空間
delete[] p1 //釋放由new[]申請的空間
  • c++程序中動態分配的內存不會被自動釋放
  • 指針函數和函數指針含義相同嗎?完全不同!
    指針函數:若一個函數返回的是一個地址,則稱該函數爲指針函數。格式是 數據類型* 函數名(參數列表)
    函數指針:指針變量指向一個函數的入口地址,格式爲 數據類型 (*函數指針變量)(參數列表)
    函數指針的用法
#include <iostream>
using namespace std;
int cul(int (*pf)(int,int), int x, int y){
	return pf(x,y);
}
int add(int x,int y){
	return x+y;
}
int sub(int x,int y){
	return x-y;
}
int main(){
	int a=10,b=20;
	cout<<a<<"+"<<b<<"="<<cul(add,a,b)<<endl;
	cout<<a<<"-"<<b<<"="<<cul(sub,a,b);
}

在這裏插入圖片描述

  • 常量指針、指針常量、指向常量的指針常量有什麼區別
    常量指針:表示指針指向的是一個常量,格式:const 類型* 指針變量 或 類型 const * 指針變量
int i;
const int *p = &i;
*p = 10; //錯誤
i = 10; //正確

指針常量:表示所定義的指針是一個常量,只能在定義的時候初始化

int i,j;
int * const p = &i;
p = &j;//錯誤

指向常量的指針常量:格式爲 const 類型 * const 指針常量

int i,j;
const int * const p = &i;
*p = 10;//錯誤
p = &j;//錯誤
i = 10;//正確
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章