指针编程艺术

这段时间仔细看了看 蔡明志写的《指针的编程艺术》,对指针有更深的理解。对这段时间所看内容进行一下整理吧......

(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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值