指针是内存单元的地址,也就是内存单元的编号。指针是一种数据,它是一种变量,也有数据类型。
1.定义
在定义整型普通变量时是:int i;这表示定义了一个整型类型的变量i,指针变量定义如下:
int *p1;//定义了一个整型指针变量p1
char *p2;//定义了一个字符型指针变量p2
double *p3;//定义了一个浮点型指针变量p3
引出了一个新的符号“*”,指针运算符*是一个单目运算符,通常称为间接访问运算符或引用运算符,“*”的作用是引用指针指向的变量值,称解引用。指针变量就比普通变量多了一个解引用。
2.赋值
给一个指针变量赋值和给普通变量赋值一样,可以在定义的同时赋值,也可在定义之后,再赋值。如:
int *p=&a;//定义一个整型的指针变量p指向变量a
int *p;
p=&b;//p存放的是b的地址
在这里符号“&”是取地址符,意思就是把a的地址赋给p,换句话说,p保存的就是a的地址。所以得出结论地址==指针。
3.只要是变量就会有内存,只要有内存就会有地址。所以一个指针变量也是有地址的。如:
int a=10;
int b=20;
int *p=&a;
int **pp=&p;
但是不可以有这样的int **pp=&&a;,虽然&a是a的地址,但是一个变量只要从它定义开始,它的地址就不会改变。如下面代码所以&a是一个常量。常量是没有内存的,因此&a是不能取地址的。
#include <stdio.h>
int main()
{
int a=10;
int b=20;
int *p=&a;
int **pp=&p;
printf("&a=%d\n",&a);
p=&b;
printf("p=%d\n",p);
*p=1000;
printf("*p=%d\n",*p);
printf("b=%d\n",b);
**pp=555555;
printf("a=%d\n",a);
printf("b=%d\n",b);
}