静态指针:数组的下标;
动态指针:惟一存放地址的变量;(一般就是存放的是值)。
定义方法:
指针的类型 *指针变量名;//
说明:
<1> 指针的类型是有他所指向的变量类型决定的;
<2>*是指针的标识符,看到*知道他是指针 ;
<3>指针变量名取合法的标识符;
int a=5;
int *pa=&a;// &取地址符,进行取地址运算!
pa中存放a在内存中的地址;通过这个地址可以找到a;
例如1:
#include<iostream.h>
void main()
{
int k=3,l=6;
cout<<k<<" 地址是: "<<&k<<endl;
cout<<l<<" 地址是: "<<&l<<endl;
int *pk=&k;
int *pl=&l;
cout<<pk<<" 地址是: "<<&pk<<endl;
cout<<pl<<" 地址是: "<<&pl<<endl;
int **ppk=&pk;//此时ppk为二级指针,他存放是地址1,通过这个地址1找到的还是一个地址2,通过现在的地址2可以找到变量;
}
指针的注意事项:
(1)、一级指针 是走一步,访问变量;二级指针是走二步,访问变量;
(2)、指针+(-)整数,表示指针上、下移动;如:
int s[5]; //一维数组的数组名就是一个一级指针,指向数组的第一个元素(即s中)存放s[0]的地址)
int *pa=s;//或者 pa=&s[0] 两者结果相同
pa=s+3;//pa指向s[3];
pa=pa-2;//pa指向s[1];
(3)、两个指针相减,表示中间相差元素的个数;
如: int s[5]={1,2,3,4,5}; pa=s+4;//pa指向s[4]
ps-s=4//中间有4个元素;
注意:两个指针相加,是错误的运算
(4)、空指针的运用,int *p=0;//或者=NULL
指针为空,表示指针不指向任何位置,指向一个空的位置。
一般用于,链表的结束。
(5)、指针的两大作用:
<1>间接访问变量,我们可以通过一个指针间接地去修改指针所指向的变量的值
;//此功能有点危险,这样就可以通过一些手段去修改某个变量的值。
方法: int a=6;int *p=&a;
二级指针要**两个才能去间接访问变量。
<2>动态申请空间:
int *p=(int *)malloc(sizeof(int));//申请一个单元
*p=7;
(1)、指针数组:存放多个指针类型的变量;
如1: int *array[3];//
说明如下:array是个数组,有3个元素,每个元素里面放一个指向整型的指针 ;//画图
[array]--> array[0]--->[ 5] x
array[1]--->[6] y
array[2]--->[7] z //(int x=5,y=6,z=7)
则: array是 一个二级指针,**array=10;则x=10;
访问方式为:*(array[i])=666;
如2: char *name[10];//字符串指针数组
说明如下:name是一个数组,有10元素,每个元素里面放一个指向字符的指针;
如在计算机里面存储
"张三"
"李四"
"王五"
可以用char *name[10];
访问方式为:name[0]="张三"; 也可以
for(int i=0;i<10;i++)//读入10人的姓名
scanf("%s",name[i]);
(2)、数组指针:指针是指向一个数组的
如: int a[5];//一维数组的数组名就是一个指向第一个元素的指针;
a就是数组指针;
访问方式为:a[i]或者*(a+i);
(3)、指向指针的指针:二级指针;
如:int a=6,*pa=&a;
int **p=&pa;//二级指针
**p=99;//二级指针加**访问变量
(4)、int *sp[4]; 与 int (*sp)[4]的区别:
int *sp[4];//sp是一个数组,数组有4个元素,每个元素里面存放一个指向整型的指针
//sp是一个二级指针
int (*sp)[4];//sp是一个指针,sp是一个行指针,指向某行该行有4列个元素;此处不是很理解
//sp就是一个二维数组的行指针,sp+1移到下一行,移动4个元素
联系客服