指針的簡單理解

##1、指針概述ios

###1.指針是什麼? 簡單來講,指針是一個地址,其指向存儲某一個數據的存儲地址。 一個變量的指針就是這個變量的地址。存放地址的變量,就是指針變量。數組

###2.定義指針數據結構

存儲類型名 數據類型 *指針變量名

函數

int *p;

p即爲指針變量。spa

把指針變量指向的變量的數據結構稱爲指針的數據類型,而任何一個指針變量自己數據值的類型都是unsigned long int。指針

###3.指針的初始化 用地址量初始化指針變量。code

##2、指針的運算內存

###1.取地址與取值運算ci

  • &運算符:爲取地址運算符,&x的值爲x的地址
  • *運算符:指針運算符或指向運算符也稱間接運算符

對於指針px:字符串

  • px -- 指針變量,它的內容是地址量。
  • *px -- 指針的目標變量,它的內容是數據。
  • &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指針

  • 聲明指向常量的指針:關鍵字const放在指針類型前。程序不能經過指針來改變它所指向的值,可是指針自己的值能夠改變,即指針能夠指向其餘數據。
  • 聲明指針常量:關鍵字const放在「*」號和指針名之間。指針自己的值不能夠改變,即它不能指向其餘數據,但它所指向的數據的值能夠改變。
  • 聲明指向常量的指針常量:在指針類型前、「*」和指針名之間都加關鍵字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;
}
相關文章
相關標籤/搜索