(一)基本概念
定义:指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
指针变量的初始化
通过赋值语句初始化指针变量;C 语言中指针初始化是指给所定的指针变量赋初值;
地址与指针
指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在 C 语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
指针变量及其定义
指针变量是存放一个内存地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。定义指针变量的一般形式为:类型说明符*变量名。
类型说明符表示指针变量所指向变量的数据类型;*表示这是一个指针变量;变量名表示定义的指针变量名,其值是一个地址,例如:int* p1(或int *p1两者等价);表示 p1 是一个指针变量(类型int*),它的值是某个字符变量的地址。
注意:
不允许把一个数赋予指针变量
改变形参不代表改变实参
字符串指针指向的是一个字符串
野指针:C 语言中指针初始化是指给所定义的指针变量赋初值。指针变量在被创建后,如果不被赋值,他的缺省值是随机的,它的指向是不明确的,这样的指针形象地称为 “ 野指针 ”。野指针是很危险的,容易造成程序出错,且程序本身无法判断指针指向是否合法。
指针变量初始化时避免野指针的方法:可以在指针定义后,赋值 NULL 空值,也可写成如下形式:
举例说明int*p;p=NULL;p=0 或 p='\0'这两种形式和 p = NULL 是等价的.
上面两行代码的含义是,指针变量 p 被赋值为空。虽然定义了一个指针变量,但是它并不指向任何存储空间。
悬浮指针:一开始有指向,后面 没有指向的指针(被释放)。
空指针:就是宏定义的(void*)0 ;
#include <stdio.h>
int main({
//1.操作系统os对内存的编号,该编号是整数
int a=0;
printf("a的地址:%p",&a);//&取地址符
//2.指针变量用来存储地址的变量;通常定义指针变量,所占用内存是一样的 64位:8字节 32位:4字节
//指针变量如何创建:类型* 变量名;
int* p1;//指针变量的类型:去掉变量名;指针所指向的类型(指针操作类型):去掉变量名*;
//空类型指针 void*
void* Pvoid;//万能指针访问数据必须要做目标类型的强制转换
//3.NULL就是宏定义的 (void*)0;野指针:通常是没有指向的指针,如int* p;悬浮指针:指针开始有指向,后 面没有指向(释放内存)
int* p=NULL;
printf("%p",p);
//4.指针变量没有存储变量地址,是不能直接访问;访问方式:*指针变量;指针变量[0];
int* p2=&a;
printf("%d",*p2);//输出0;
printf("%d",p2[0]);
//5.指针类型的移动:不同类型移动的字节不是一样的 指针变量p+n(数)=p+(sizeof(指针所指向的类型)*n)
char* p3=NULL;
printf("%p",p);
printf("%p",p3);
p++;p3++;
printf("%p",p);
printf("%p",p3);
return 0;
}
指针的移动:
(二)指针操作数组
(三)指针操作字符串
#include <stdio.h>
int main()
{
char* pstr="Imissyou";
//pstr[0]=He;引发了异常:写入访问权限冲突
//修改字符串的正确做法:用数组存储,用指针操作
char a[20]="Imissyou";
char* p =a;
puts(a);//输出Imissyou
puts(p);//输出Imissyou
p[3]='a';
puts(p);//输出Imiasyou;
return 0;
}
(三)指针数组与数组指针
区别:看哪个在后面就是什么,指针数组本质就是数组;数组指针本质就是指针
①指针数组:char* p[20]={"Iloveyou","very love you","biebiezuo"};//p[i]都是char* 的类型指针
②数组指针:int(*p1)[3]=NULL;
#include <stdio.h>
int main(){
int(*p)[3]=NULL;//操作二维数组的列数是固定的
int a[2][3]={0,2,4,6,8,10};
p=a;
//用数组指针输出二维数组
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
printf("%d ",p[i][j]);
}
printf("\n");
}
//方法2
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
{
printf("%d ",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}