以下内容是学习尚硅谷
12.1 指针基本介绍
1)指针是C语言的精华,也是C语言的难点
2)指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。关于指针的基本使用,在讲变量的时候做了入门级的介绍
3)获取变量的地址,用&,比如:int num=10,获取num的地址:&num
4)指针类型,指针变量存在的是一个地址,这个地址指向的空间存的才是值
比如: int *ptr = # ptr就是指向 int类型的指针变量,即 ptr是 int*类型。
5)获取指针类型所指向的值,使用: * (取值符号),比如: int * ptr,使用*ptr获取 ptr指向的值
12.2 什么是指针
12.3 指针的算术运算
指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-
12.3.1 指针递增操作(++)
1)案例演示
#include <stdio.h>
#include <string.h>
#include <stdio.h>
const int MAX=3;
int main(){
int var[]={10,100,200};
int i,*ptr;
ptr=var;
for(i=0;i<MAX;i++){
printf("var[%d]地址=%p\n",i,ptr);
printf("存储值:var[%d]=%d\n",i,*ptr);
ptr++;//ptr=ptr+1(1个int字节数)
}
getchar();
return 0;
}
2)示意图
3)小结
- 数组在内存中是连续分布的
- 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加
12.3.2 指针递减操作(–)
#include <stdio.h>
#include <string.h>
#include <stdio.h>
const int MAX=3;
int main(){
int var[]={10,100,200};
int i,*ptr;
ptr=&var[MAX-1];//&var[2]
for(i=MAX;i>0;i--){
printf("ptr存放的地址=%p\n",ptr);
printf("存储值:var[%d]=%d\n",i-1,*ptr);
ptr--;//ptr=ptr-1(1个int字节数)
}
getchar();
return 0;
}
2)小结
- 数组在内存中是连续分布的
- 当对指针进行–时,指针会按照它指向的数据类型字节数大小减少
12.3.3 指针+、-操作
1)案例演示
#include <stdio.h>
#include <string.h>
#include <stdio.h>
int main(){
int var[]={10,100,200};
int i,*ptr;
ptr=var;
ptr+=2;
printf("var[2]=%d var[2]的地址=%p ptr存储的地址=%p ptr指向的值=%d",var[2], &var[2], ptr,*ptr);
getchar();
return 0;
}
2)小结
可以对指针按照指定的字节数大小进行+或者–的操作,可以快速定位你要的地址
12.4 指针的比较
指针可以用关系运算符进行比较,如==、<<=和>>=。如果pl和 p2指向两个变量,比如同一个数组中的不同元素,则可对pl 和 p2进行大小比较,看下面代码,说明输出什么?
案例1
#include <stdio.h>
#include <string.h>
#include <stdio.h>
int main(){
int var[]={10,100,200};
int *ptr;
ptr=var;
//if(ptr == var[0]){//错误,类型不一样(int *)和(int )
//printf("ok1");
//}
if(ptr==&var[0]){//可以
printf("\nok2");
}
if(ptr==var){//可以
printf("\nok3");
}
if(ptr>=&var[1]){//可以比较,但是返回false
printf("\nok4");//不会输出
}
getchar();
return 0;
}
案例2
#include <stdio.h>
#include <string.h>
#include <stdio.h>
const int MAX=3;
int main(){
int var[]={10,100,200};
int i,*ptr;
ptr=var;
i=0;
while (ptr<=&var[MAX-2]) {
printf("Address of var[%d]=%x\n",i,ptr);
printf("Value of var[%d]=%d\n",i,*ptr);
ptr++;
i++;
}
getchar();
return 0;
}
12.5 指针数组
12.5.1 基本介绍
要让数组的元素指向int或其他数据类型的地址(指针)。可以使用指针数组。
12.5.2 指针数组定义
数据类型 *指针数组名[大小];
1)比如:int *ptr[3];
2)ptr声明为一个指针数组
3)由3个整数指针组成。因此,ptr中的每个元素,都是一个指向int值的指针
12.5.3 指针数组快速入门和内存布局示意图
#include <stdio.h>
#include <string.h>
#include <stdio.h>
const int MAX=3;
int main(){
int var[]={10,100,200};
int i,*ptr[3];
for(i=0;i<MAX;i++){
ptr[i]=&var[i];
}
for(i=0;i<MAX;i++){
printf("Value of var[%d]=%d ptr[%d]本身的地址=%p \n",i,*ptr[i],i,&ptr[i],&ptr[i]);
}
getchar();
return 0;
}
12.6 指向指针的指针(多重指针)
12.6.1 基本介绍
12.6.2 多重指针(二级、三级)快速入门案例
1)一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int类型指针的指针:
int **ptr;//ptr的类型是int **
2)当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,比如 **ptr
3)案例演示+内存布局图
#include <stdio.h>
#include <string.h>
int main(){
int var;
int *ptr;//一级指针
int **pptr;//二级指针
int ***ppptr;//三级指针
var=3000;
ptr=&var;
pptr=&ptr;
ppptr=&pptr;
printf("var的地址=%p var=%d \n",&var,var);
printf("ptr的本身的地址=%p ptr存放的地址=%p *ptr=%d \n",&ptr,ptr,*ptr);
printf("pptr的本身的地址=%p pptr存放的地址=%p **pptr=%d \n",&pptr,pptr,**pptr);
printf("ppptr的本身的地址=%p ppptr存放的地址=%p ***ppptr=%d \n",&ppptr,ppptr,***ppptr);
getchar();
return 0;
}