指针的基础知识

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=&num;   
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=&num;   
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=&num;   
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; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值