指針編程藝術

這段時間仔細看了看 蔡明志寫的《指針的編程藝術》,對指針有更深的理解。對這段時間所看內容進行一下整理吧......

(1)指針主要用於變量、一維數組、二維數組以及結構體等

 在c中要輸出地址則可以採用 

int x=10;
printf("%p\n",&x);

變量x: 一個指針指向一個變量,則指針內容爲變量的地址,而指針符號"*"可以看做一把鑰匙,變量看成一個信箱,知道了指針的內容,相當於知道了是那個信箱,要想獲取變量的值(相當於信箱裏的內容),則需要一把鑰匙,因而通過指針間接訪問變量值,指針前需要加符號“*"。

一維數組x[n]:一維數組名x代表數組第一個元素地址,x+i(0<=i<n)表示第i+1元素地址。

二維數組x[m][n]:   x代表第一行第一列元素地址,x+i表示第i+1行第一列元素地址,而x[j]+i表示第j+1行第i+1列元素的地址 , x[0]+m(m可以大於n),表示往後偏移m個單位,

因爲數組的存儲形式是連續的。



   結構體: 指針指向結構體變量,即指針內容爲結構體變量的地址。


(2)指針與變量程序實例分析

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ 
	//三重指針
	int x=10;
	int *p1=&x;
	int **p2=&p1;
	int ***p3=&p2;
   
	cout<<"x的地址"<<&x<<endl;
	cout<<"p1的地址"<<&p1<<"  p1的內容"<<p1<<endl;
	cout<<"p2的地址"<<&p2<<"  p2的內容"<<p2<<endl;
	cout<<"p3的地址"<<&p3<<"  p3的內容"<<p3<<endl;
	 
	system("pause");
	return 0;
}


 

注意爲了安全性需要,往往會使用const,需要分清常見以下三種情況:

int a=0;
int * const p=&a; //指向整型的常指針 指針指向的內容可變,指針的指向不可變(地址不可變)
const int *p=&a; //指向常整型的指針 指針指向可變,指向內容不可變
const int * const *p=&a;//指向常整型的常指針  指針指向內容和指向都不可變


(2)指針與數組

1.指針與一維數組

 數組名是指針常量,不能進行遞增、遞減操作。


 

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ 
	int a[]={10,20,30,40,50,60};
	int *p=a+2;
	
	for(int i=-2;i<=3;i++)
	{
	 cout<<"p["<<i<<"]="<<p[i]<<endl;
	}
	
	p++;
	cout<<"p[0]="<<p[0]<<endl;
	cout<<"*(p+0)="<<*(p+0)<<endl;

	cout<<"*p++="<<*p++<<endl;
	cout<<"*++p="<<*++p<<endl;
	cout<<"++*p="<<++*p<<endl;
	
	system("pause");
	return 0;
}

很容易得出p[-2]=10,p[-1]=20,p[0]=30,p[1]=40,p[2]=50,p[3]=60;

p++,指針p往後移一個單位,則p=a+3,此時p[0]=*(p+0)=40;

*p++, 是先取出*p的值,再執行p++操作, 則*p++=40,p=a+4;

*++p,p先往後移一個單位,再取對應地址的值,則*++p=60;

++*p, 則是先取出*p的值,對*p的值再加1,則++*p=61;




如果加上如下代碼: 

	p=(int *)(&a+1);
	cout<<*(p-1)<<endl;

輸出結果爲61,即數組最後一個元素。 原因在與&a是一個指向一個數組的指針 int (*) [], &a移一個單位,相當於偏移了整個數組的大小。

2.指針與二維數組

一維數組元素的值,可以使用一個[ ]或*得到;

二維數組元素的值,則需要兩個*,或一個*與一個[ ],或兩個[ ],才能得到數組的元素值,其餘的表示法,只能得到數組元素的地址。

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ 
	int a[][2]={10,20,30,40,50,60};
	
	for(int i=0;i<3;i++)
	{
		cout<<"a["<<i<<"]="<<a[i]<<endl;
	}
	for(int i=0;i<3;i++)
	{
		cout<<"a+"<<i<<"="<<a+i<<endl;
	}
	for(int i=0;i<3;i++)
	{
		cout<<"*(a+"<<i<<")="<<*(a+i)<<endl;
	}
	//獲取a[1][1]的地址
	cout<<"獲取a[1][1]的地址"<<endl;
	cout<<&a[1][1]<<endl;
	cout<<*(a+1)+1<<endl;
	cout<<a[0]+3<<endl;
	cout<<a[1]+1<<endl;
	cout<<endl;

	int *p=(int *)a+2;//偏移2個單位
	cout<<*p<<endl;
     p=(int *)(&a+1); //偏移整個數組大小
    cout<<*(p-1)<<endl;

	system("pause");
	return 0;
}


(3)數組指針

數組指針表示數組的每一個元素都是指針,如char *p[4];


<pre name="code" class="cpp">#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ 
	
	char *a[]={"University","of","Science","And","Technology"};

	//獲取字符串Science中德'i'
	cout<<"獲取字符串Science中德'i'"<<endl;
	cout<<*(a[2]+2)<<endl;
	cout<<a[2][2]<<endl;
	cout<<*(*(a+2)+2)<<endl;

	//輸出Technology中德子串nology
	cout<<a[4]+4<<endl;
	cout<<&a[4][4]<<endl;
	cout<<*(a+4)+4<<endl;


	system("pause");
	return 0;
}



 (4)指向數組的指針

(*p)[4]是指向數組的指針,指針p指向一個有4個元素的數組。

//

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ 
	
	int a[][3]={10,20,30,40,50,60};
	int (*p)[3];
	int sum=0;

	p=a;
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<3;j++)
		{
			sum+=*(p[i]+j);
		}
	}
	cout<<sum<<endl;
	
	system("pause");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章