指针基本知识复习

这篇博客详细讲解了C语言中指针的使用,包括定义指针、明确指针指向、操作指针空间的三个步骤。还探讨了二级指针的概念,以及指针与字符数组、整型数组的关系。同时,解释了指针数组和数组指针的差异,并通过实例展示了它们的用法。博客内容深入浅出,适合C语言初学者和进阶者学习。
摘要由CSDN通过智能技术生成

一使用指针的三步骤

1;定义一个指针变量

2;明确指针的指向,这一步必不可少

3;操作指针指向的空间;

char *p ;

*p = 'H';这种写法是错误的,原因是因为指针的指向不明确;

int *p;

char value = 'n';

p = &value;

*p++; //相当于先取p的地址然后再p++,表达式的结果为*p

p++;//指针的是指向向后偏移一个char(数据类型);

(*p)++;相当于value++,指针的指向没有变,相当于value++表达式结果为p++之前取值

++(*p);相当于++value,指针的指向没有变,表达式的结果为++p之后取*取值

二级指针

int  a= 10;

int *p=&a;

int **q=&p;

q++;//指针的指向改变为指向在p后面加一个int*类型大小的空间的首地址

*q++;//相当于先取出*p的值,然后q++  指针指向改变了

(*q)++;//相当于p++;指针指向改变了 

p++;//相当于p指向a后面一个int类型的大小的空间的首地址

*p++;//相当于先取*p的值,然后p++

(*p)++;//相当于a++

指针和一位数组

char str[]={"hello word"};

int *p = str;

等价关系str[i]<==>*(str+i)<==>p[i]<==>*(p+i);

区别:str是常量   p是变量

char *p = "helloworld";
char a[] = "helloworld";
char *str;
char b[32];

p++;//正确的,相当于p的指针向后偏移了一个char
*p++;//正确的,相当于先取*p 然后再p++;表达式返回的结果为*p
(*p)++;//错误的,常量区的内容不允许被修改,
*p = 'H';//错误的,常量区的内容不允许被修改;
p = "hqyj";//正确的,指针的指向可以改变
a++;//错误的,数组名是常量 不能++
*a++;//错误的,a不能++;数组名不能++
(*a)++;//正确的,相当于a【0】++
*a = 'H';//正确的,相当于a【0】='H';;;

a = "hqyj";//错误的,a是数组名不能被赋值
str++;//正确的,指针的指向向后偏移一个char
*str = 'H';错误的,常量区的内容不允许被修改
str = p;//正确的,指针变量间的相互赋值
*str = 'H';错误的,常量区的内容不允许被修改
b = a;错误的,b也是数组名不能被赋值,数组一点定义好了就不能修该
 

指针数组

本质是一个数组,数组中每一个元素都是一个指针

char *s[4] = {"./a.out", "hello", "world", "beijing"};

//s是一个指针数组 每个元素都是一个 char * 类型的指针

//s[0]指向 "./a.out" //s[1]指向 "hello"

//s[2]指向 "world"

//s[3]指向 "beijing"

printf("%s\n", s[1]);//hello

printf("%s\n", *(s+2));//world

printf("%c\n", *(*(s+3)+3));//'j'

printf("%c\n", s[3][3]); //'j'

数组指针本质是一个一个指针,指向一个二维数组,也叫行指针

int s[2][3] = {1,2,3,4,5,6};

int (*p)[3] = s;//定义了一个行指针p指向 二维数组s

等价关系: s[i][j] <==> *(s[i]+j) <==> *(*(s+i)+j) <== ==> p[i][j] <==> *(p[i]+j) <==> *(*(p+i)+j) 区别: s 是常量 p 是变量 p++;

//p的操作空间是 3个int 所以p++ 相当于p偏移了 12个字节 *p+1;

//*p 操作空间是 1个int 所以 *p+1 是 第0行第1个元素的地址 *(*p+1);//第0行第1个元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值