这段时间仔细看了看 蔡明志写的《指针的编程艺术》,对指针有更深的理解。对这段时间所看内容进行一下整理吧......
(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;
}