指针其实很容易理解的,其他并不是大家想象的那么神奇,那么难。
一、指针的含义:指针其实就是一个变量,它所存放的不是数据,而是数据在内存中地址。当然指针也可以存放函数(方法)的地址,后面会讲到的。声明指针的关键符是*号,指向地址的关键符是&。
二、指针变量:
例如1:#include <stdio.h>
int main
{
int a =10; //第一一个变量a,赋值为10
int *p = &a; //p就是一个指针变量,所指向的就是变量a的地址
printf("%d\n" , p); //输出指针变量P所指向该地址的变量a的值
}
例如2通过指针修改变量的值:
#include <stdio.h>
void change(int *a);
int main
{
int a =10; //第一一个变量a,赋值为10
change(&a); //p就是一个指针变量,所指向的就是变量a的地址
printf("%d\n" , a); //输出指针变量P所指向该地址的变量a的值
}
void chage(int *a)
{
*a =20; //通过指针修改a的值
}
三、指针的指针:通过上面介绍的指针含义跟指针变量,对于指针的指针字面上来理解大家应该能懂了吧,下面举个例子:
int mait
{
int a = 20; //第一一个变量a,赋值为10
int *p = &a; //p就是一个指针变量,所指向的就是变量a的地址
int **pp = &p; //pp就是一个指针的指针变量,所指向的就是变量指针变量p的地址(&p表示指针变量p的地址)
printf("%d\n" , **pp) //输出的值就是a的值
}
输出:20
上面的例子这样写的话你们会更明白 *pp == p; //指针变量*pp找到指针变量p的存储空间
*(*pp) = *p = a; //指针变量*pp找到所指向地址的值(两者相同)
**pp = *p = a; //指针变量*pp找到所指向地址的值(两者相同)
四、指针使用的三大注意:
①:指针类型只能指向相同类型的数据
错误演示1:
#include <stdio.h>
int main
{
int *p ;
double d = 10.0 ;
p = &d;
printf("%d\n" , *p); //不会报错,只会警告!
}
②:指针变量只能存储地址
错误演示2:
#include <stdio.h>
int main
{
int *p ;
p = 200; //p只能存储地址 , 除非200是一个地址
printf("%d\n" , *p);
}
③:指针变量未经过初始化,不要拿来间接访问其他存储空间
错误演示3:
#include <stdio.h>
int main
{
int *p ;
printf("%d\n" , *p);
}