1、基本概念
地址:内存的基本单元是字节,每个字节都有一个编号,这个编号就称为地址
指针:地址就是指针指针变量:专门用来存放地址的变量
定义:存储类型 数据类型 *指针变量名;
存储类型:指针变量的存储类型
数据类型:指针变量所指向的变量的数据类型
指针的类型:数据类型*
&:地址运算符
*:取指针变量所指向的变量的内容
指针在内存当中的大小都为4字节(32位操作系统)
2、指针变量的初始化及赋值
int *p = &a;空指针:可以用来表明该指针当前并未指向任何对象
int *p = NULL; //此时p为空指针
野指针:先赋值,再使用
int *p; //p为野指针
*p = 5; //error
int a = 10;
*p = &a;
#include<stdio.h>
void main()
{
int i = 3;
int* p = &i;
// p = &i;
void *pointer = NULL;
float j = 3.14;
double k = 89.78;
char a = 'a';
pointer = &j;
pointer = &k;
pointer = &a;
*p = 20;
printf("p=%p,&i=%p,i=%d\n",p,&i,i);
return ;
}
3、二级指针:指针的指针
定义:存储类型 数据类型 **指针变量名
4、指针的运算
实质上就是地址的算术运算
p+n:向地址增大的方向移动了n个数据
地址值的变化:p+n*sizeof(数据类型),其中数据类型指的是指针变量指向的变量的数据类型
p-n:向地址减小的方向移动了n个数据
地址值的变化:p-n*sizeof(数据类型)
p++/++p:p向地址增大的方西移动了一个数据
地址值的变化:p+sizeof(数据类型),其中p的值为没有自加之前的值
p--/--p:p向地址减小的方向移动了一个数据
地址值的变化:p-sizeof(数据类型),其中p的值为没有自减之前的值
p-q:两指针相减,结果为两指针之间相隔的数据的个数
值的变化:(p-q)/sizeof(数据类型)
指针的算术运算用在数据连续存储时才有意义
指针的关系运算:if(NULL==p)或者if(p!=NULL)
5、const修饰的指针:左数右指
const int *p = &a; // *p不能被修改,p可以被修改,a可以被修改
int *const p = &a; // *p可以被修改,p不能被修改,a可以被修改
const int *const p = &a; //*p不能被修改,p不能被修改,a可以被修改
void:void修饰的指针在使用之前,必须要进行强制类型转换
void a; //系统不知道要分配多大的内存给a,所以void不能修饰普通变量
6、指针与一维数组
int a[ 10 ];
int *p = a;
当数组名a遇到*或&可以当作变量来用
a[ i ] 、*(p+i)、*(a+i)和p[ i ]具有完全相同的功能:访问数组第i+1个数组元素,但是a和p本质上是不同的,p是地址变量,a是地址常量
a、&a[0][0]、a [0]、都是a[0][0]的地址,他们的值是一样的
a+1与(int *)(a+1)加1后移动的长度不一样,(a+1)+1移动1行,而(int *)(a+1)+1移动一个元素
char str[] = “hello world”; // 字符串存放在栈区
char *p = str;
char *q = “hello world”; //字符串存放在字符串常量区
#include<stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p = NULL;
p = a;
printf("&a[0]=%p,a=%p,a+1=%p,a+2=%p\n",&a[0],a,a+1,a+2);
printf("a[0]=%d,*a=%d,a[1]=%d,a[2]=%d\n",a[0],*a,*(a+1),*(a+2));
printf("&a[0]=%p,&a[1]=%p\n",p,p+1);
printf("a[0]=%d,a[5]=%d\n",*p,*(p+5));
printf("p[0]=%d,p[5]%d\n",p[0],p[5]);
return 0;
}
指针与二维数组
#include<stdio.h>
int main()
{
int a[2][3]={1,2,3,4,5,6};
printf("a=%p,a[0]=%p,a[0]+1=%p,a[1]=%p\n",a,a[0],a[0]+1,a[1]);
printf("*a=%p,a[0][1]=%d,*(a+1)=%p\n",*a,*(a[0]+1),*(a+1));
printf("a[1][0]=%d,a[1][0]=%d,a[0][0]=%d\n",*(*(a+1)),*(a[1]+0),*(*a));
return 0;
}
7、指针数组数组元素为指针的数组;
int *p[3];