這段時間仔細看了看 蔡明志寫的《指針的編程藝術》,對指針有更深的理解。對這段時間所看內容進行一下整理吧......
(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;
}