1、指针的定义和初始化
指针变量的定义:DataType *PName; DataType:可以是任意一种数据类型 PName:合法标识符 *:注意,*在变量定义的时候只是指针变量的标识,在其他位置的时候 标识取出指针指向空间内的值 &:取地址符,通过此符号可以取出变量的地址值 :间接运算符,通过可以取出指针指向空间内的数值 变量名:PName PName的类型:DataType *(出去变量名以外的就是变量的类型) PName指向空间存储的数据的类型:DataType
指针的初始化:
不初始化: DataType *PName; //被称为野指针,指向空间不确定,避免野指针 初始化为空: DataType *PName=NULL;//被称为空指针,空指针就是没有指向的指针 NULL其实就是(void *)0 初始化为变量的地址: DataType VarName=value; DataType *PName=&VarName;
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num=10;
int *p;
printf("p=%p\n",p);
int *p1=NULL;
printf("p1=%p\n",p1);
int *p2=#
printf("p2=%p\n",p2);
return 0;
}
#include <stdio.h> #include <stdlib.h> int main() { int num=10; int *p=# printf(“p=%p\n”,p); printf("&num=%p\n",&num); printf(“num=%d\n”,num); printf("*p=%d\n",*p); return 0; }
2、指针的赋值和指针的使用
指针的赋值
指针的赋值:
DataType VarName=value; DataType *PName=NULL; PName = &VarName;
提示:
PName是指针变量,用来存储地址的值 *PName是取出PName指向空间内的值 指针可以改变指向
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num=10,num1=20;
int *p=#
printf("p=%p\n",p);
printf("&num=%p\n",&num);
printf("num=%d\n",num);
printf("*p=%d\n",*p);
//*p=num1;
p=&num1;
printf("*p=%d\n",*p);
return 0;
}
3、指针和数组的关系
数组名即为数组的首地址(同时也是数组首元素的地址),那么可以定义一个指针变量来接收数组的名字,这样指针就指向了数组,因此可以通过指针操作数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num[5]={1,2,3,4,5},i=0;
int *p=NULL;
p=num;
for(i=0;i<5;i++) {
//printf("num[%d]=%d\n",i,num[i]);
//printf("num[%d]=%d\n",i,*(p+i));
printf("num[%d]=%d\n",i,p[i]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num[5]={1,2,3,4,5},i=0;
int *p=NULL,*paddr=NULL;
p=num; paddr=p;
for(paddr;paddr<p+5;paddr++)
{
//printf("num[%d]=%d\n",i,num[i]);
//printf("num[%d]=%d\n",i,*(p+i));
printf("num[%d]=%d\n",i,*paddr);
}
return 0;
}
指针的加减法(数据):
指针的加法操作(+n)相当于在元数据的地址的基础之上向后偏移(数据类型n)个字节
指针的减法操作(-n)相当于在元数据的地址的基础之上向前偏移(数据类型n)个字节
指针与指针之间的减法:
指针与指针的相减,获取的结果是两个数组元素之间的下表差
#include <stdio.h>
#include <stdlib.h> int main()
{ int num[5]={1,2,3,4,5},i=0;
int *p=NULL,*paddr=NULL;
p=num; paddr=p;
for(paddr;paddr<p+5;paddr++) {
//printf("num[%d]=%d\n",i,num[i]);
//printf("num[%d]=%d\n",i,*(p+i));
printf("paddr=%p\n",paddr);
printf("num[%d]=%d\n",i,*paddr);
}
printf("差值=%ld\n",&num[4]-&num[2]);
return 0;
}
指针与字符串:
字符串字打印的时候只需要告知编译器字符串的首地址即可,原因是每一个字符串都有一个\0作为结尾
我们可以通过数组来存放字符串
数组的名字就是数组的首地址
指针又可以指向地址
所以指针可以直接通过字符串进行初始化
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[]="hello";
char *p=buf; buf[3]='a';
printf("buf=%s\n",buf);
p[4]='c';
printf("p=%s\n",p);
return 0;
}
冒泡排序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i=0,j=0,tmp=0;
time_t times=0;
int num[10]={0};
int *p=NULL;
p=num;
times=time(NULL);
srand(times);
for(i=0;i<10;i++)
{
p[i]=rand()%100;
}
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,p[i]);
}
printf("\n"); for(i=0;i<10;i++)
{
for(j=0;j<10-1-i;j++)
{
if(p[j]>p[j+1])
{
tmp=p[j];
p[j]=p[j+1];
p[j+1]=tmp;
} } }
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,p[i]);
}
printf("\n");
return 0;
}
4、指针数组和数组指针
指针数组:
指针在前,数组在后,说明此类型为数据类型为指针的数组,即该类型为一个存放指针的数组
定义格式:
DataType *PName[len]={NULL};
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *p=NULL;
char *pstr[5]={"hello","nihao","haha","hehe","gun"};
int i=0;
for(i=0;i<5;i++)
{
printf("pstr[%d]=%p\n",i,pstr+i);
printf("pstr[%d]=%s\n",i,pstr[i]);
}
printf("sizeof(p)=%lu\n",sizeof(p));
printf("sizeof(pstr)=%lu\n",sizeof(pstr));
return 0;
}
数组指针:数组在前,指针在后,说明该类型为一个数组的指针,即一个指向数组的指针
DataType (*PName)[len]={NULL};
一般结合二维数组
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main()
{
int num[2][3]={1,2,3,4,5,6};
int i=0,j=0;
int (*p)[3]=num;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
//printf("num[%d][%d]=%d\n",i,j,num[i][j]); //printf("num[%d][%d]=%d\n",i,j,p[i][j]); printf("num[%d][%d]=%d\n",i,j,*(*(p+i))+j);
} }
return 0;
}
5、多级指针
存放指针的地址的变量
定义:
DataType VarName=value;DataType *PName=&VarName;DataType **PPName=&PName;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int num=10;
int *p=#
int **p1=&p;
printf("num=%d\n",num);
printf("*p=%d\n",*p);
printf("p=%p\n",p);
printf("p1=%p\n",p1);
printf("*p1=%p\n",*p1);
printf("**p1=%d\n",**p1);
return 0; }