##1、指針概述ios
###1.指針是什麼? 簡單來講,指針是一個地址,其指向存儲某一個數據的存儲地址。 一個變量的指針就是這個變量的地址。存放地址的變量,就是指針變量。數組
###2.定義指針數據結構
存儲類型名 數據類型 *指針變量名
如函數
int *p;
p即爲指針變量。spa
把指針變量指向的變量的數據結構稱爲指針的數據類型,而任何一個指針變量自己數據值的類型都是unsigned long int。指針
###3.指針的初始化 用地址量初始化指針變量。code
##2、指針的運算內存
###1.取地址與取值運算ci
對於指針px:字符串
例:
#include<iostream> using namespace std; int main() { int a = 1; int *p; p = &a; cout << "p =" << "\t" << p << endl; //p = 0018F800 cout << "*p =" << "\t" << *p << endl; //*p = 1 cout << "&p =" << "\t" << &p << endl; //&p = 0018F7F4 system("pause"); return 0; }
###2.指針的算數運算
#include<iostream> using namespace std; int main() { double a[5] = {1,2,3,4,5}; double *pa, *pb; pa = &a[0]; pb = &a[4]; cout << "*pa = " << *pa << endl; //*pa = 1 cout << "*pb = " << *pb << endl; //*pb = 5 //1.指針與整數的加減運算(p+n,p-n) //指針做爲地址量加上或減去一個整數n,其意義是指針當前指向位置的前方或後方地n個 //數據的位置。 //p+n的實際操做是:(p)+n*sizeof(數據類型) //p-n的實際操做是:(p)-n*sizeof(數據類型) pa = pa + 2; cout << "pa+2 = " << *pa << endl; //*pa=3 //2.指針加一、減1運算(p++,++p,p--,--p) //指針++運算後指向下一個數據的位置,指針--運算後指向上一個數據位置。 pa++; cout << "pa++ = " << *pa << endl; //*pa=4 //3.指針的相減運算(px-py) //若是兩指針px,py所指向的變量類型相同,則可對它們進行相減運算,px-py運算的結果 //值是兩指針指向的地址位置之間的數據個數。 int c = pb - pa; cout << "pb - pa = " << c << endl; //c=1 system("pause"); return 0; }
###3.指針的關係運算
#include<iostream> using namespace std; int main() { int a[5] = { 1,2,3,4,5 }; int *pa, *pb; pa = &a[0]; pb = &a[4]; //若數據在內存中的存儲邏輯是由前向後,則指向後方的指針大於指向前方的指針。 cout << "pa > pb is " << (pa > pb) << endl; //0 cout << "pa < pb is " << (pa < pb) << endl; //1 system("pause"); return 0; }
根據指針與0的比較,能夠用於判斷指針p是否爲空指針。
###4.void指針和const指針 4.1 void指針 不一樣類型的指針之間,除非進行強制類型轉換,不然不能相互賦值。 void指針是一個特例,C++中的void指針,不指定指針指向一個固定的類型:
void *p
它表示指針變量p不指向一個肯定的類型數據,它的做用僅僅是存放一個指針。任何指針能夠給void指針賦值,要將void指針賦值給其餘類型的指針,則要進行強制類型轉換。
4.2 const指針
#include<iostream> using namespace std; int main() { int a(1); int *p1(&a); void *p2(p1); int *p3((int *)p2); cout << "*p3= " << *p3 << endl; //聲明指向常量的指針 const int *p4(&a); //聲明指針常量 int * const p5(&a); //聲明指向常量的指針常量 const int * const p6(&a); cout << "*p4 = " << *p4 << endl; cout << "*p5 = " << *p5 << endl; cout << "*p6 = " << *p6 << endl; system("pause"); return 0; }
##3、指針與數組
定義一個指向數組的指針:
int a[10]; int *p = a;
或
int a[10]; int *p = &a[0];
###1.訪問數組元素的方法
int a[5]
a的值就是數組的起始地址,即a指向a[0],a+1指向a[1]...則*(a+i)=a[i].
int a[5]; int *pa = a;
則*(pa + i)=a[i]
###2.數組指針與指針數組 2.1數組指針
//定義一個數組指針,指向一個包含5個元素的一維數組 int (*p)[5];
2.2指針數組
char *name[5] = {"Tom","John","Mary"};
name是一維數組,每個元素都是指向字符數據的指針類型數據,name[0]指向第一個字符串"Tom",name[1]指向第二個字符串"John"
##4、指針與函數
###1.指針做爲函數參數 函數調用爲傳址調用,也就是使實參指針和形參指針變量指向同一內存地址。 例:
#include<iostream> using namespace std; void swap(int *,int *); int main() { int a = 3, b = 4; cout << "a = " << a << " b = " << b << endl; //a=3,b=4 swap(a, b); cout << "a = " << a << " b = " << b << endl; //a=4,b=3 system("pause"); return 0; } void swap(int *x, int *y) { int t = *x; *x = *y; *y = t; }
###2.指針型函數 除了void函數外,函數在調用結束後都會有返回值指針也能夠做爲函數的返回值。當一個函數的返回值是指針類型時,這個函數就是指針型函數。
int *fun(int a,int b); //返回一個指向整型數據的指針
例:
#include<iostream> #include<string> using namespace std; char *max(char *a, char *b) { return (strcmp(a, b) ? a : b); } int main() { char *p; p = max("hello", "good"); cout << p << endl; //輸出 hello cout << *p << endl; //輸出 h system("pause"); return 0; }
###3.函數指針 函數指針就是指向函數的指針,定義:
數據類型 (*函數指針名) (參數表)
例:
/** *函數指針:即爲指向函數的指針 *通常格式爲:數據類型 (*函數指針名) (參數表) */ #include<iostream> using namespace std; int max(int x, int y) { return (x > y ? x : y); } int main() { int(*p)(int, int); //定義函數指針 int a, b, c; p = max; //初始化函數指針 cout << "Pleasee input 2 numbers: " << endl; cin >> a >> b; c = (*p)(a, b); //經過函數指針調用函數 cout << "max(a, b): " << c << endl; system("pause"); return 0; }