指针进阶1

目录

本章将学习

1字符指针

2数组指针指针数组

3数组传参与指针传参


复习指针初阶基本知识点

        1指针是个地址(编号),指针变量是存放指针的变量,但是我们平常所说的指针就是指的指针变量,指针变量的大小有4(32位平台)/8个(64位平台)字节,产生这样大小的原因是,32位平台有32根物理地址线,即一个地址是由32个0/1所组成的二进制序列所组成的,指针的不同类型决定指针加减整数时所决定的步长,还有指针解引用时访问的权限。

 1:字符指针(char*)

字符指针即指向字符的地址

char ch ='w';
char* pch =&ch;
这里的pch就是字符指针

其实还有字符指针可以指向字符数组的->

char str[]="abcdef";
char* pstr =str;//这里的str是数组名,而数组名则是首元素的地址。
所以我们*pstr则打印出来的结果为a
还有另外一种
char* pp="abcdef";//这里我们应该将"abcdef"理解成常量字符串,是不能够改变的,所以pp的规范写法为
const char* pp ="abcdef";
那么我们如何来理解这个代码呢?
其实在我们内存中有一块区域叫做代码区,我们常量字符串就是存放在这个区域内的,pp就是指向这个常量字符串的地址的

接下来我们就看上面两种字符指针的区别

首先第一个字符指针是指向数组的首元素,而第二个指针是在代码区指向常量字符串的。

所以我们可以有以下的一个经典题目:

int main()
{
 char str1[] = "hello bit.";
 char str2[] = "hello bit.";
 const char *str3 = "hello bit.";
 const char *str4 = "hello bit.";
 
 if(str1 ==str2)
 printf("str1 and str2 are same\n");
 else

 printf("str1 and str2 are not same\n");
 
 if(str3 ==str4)
 printf("str3 and str4 are same\n");
 else

 printf("str3 and str4 are not same\n");
 
 return 0;
}

首先数组名都是首元素的地址

因为str1与str2是指向数组的首元素的地址的,而他们在开辟空间的时候需要分开开辟的,所以两个数组的地址是不同的,所以str1与str2are not same

str3与str4是常量字符串指针,它们都会指向代码区的字符串的地址,所以它们是相同的。

2数组指针指针数组

首先我们需要知道数组指针与指针数组他们的本质,我们先从一个生活中的案例来描述,比如说  好孩子,这里好孩子的本质是孩子,所以数组指针的本质是指针,指针数组的本质是数组。

数组指针:是一个指针,指向数组的指针。

指针数组:是一个数组,里面存储的元素是指针类型的。

那么如何区分他们呢?

首先为了能够区分它们我们需要知道,其实[]的运算符优先级比*要高,所以一种简单的识别方式就是看在*与[]同时出现的时候我们看*是否有()来约束,如果有则一般代表是一个指针,没有则代表是一个数组。接下来通过几个代码来判断是否为指针数组与数组指针。

int* arr1[10]; //整形指针的数组

char *arr2[4]; //一级字符指针的数组

char **arr3[5];//二级字符指针的数组
//这几个都是指针数组,在*前面未加()
int *p1[10];

int (*p2)[10];

//p1, p2分别是什么?
p1:p1是一个数组,数组中有10个元素,每个元素的类型是int*
p2:p2是一个指针,它所指向的类型是int [10]的数组,数组中有10个元素,每个元素是int类型的
本质上p1是指针数组,p2是数组指针

&数组名与数组名的区别

首先我们曾今就知道除了2中情况下数组名就是代表数组首元素的地址,所以数组名本质上就是一个地址,即数组名本质上是一个指针。

2中情况下就有   &数组名与sizeof(数组名)在这两种情况下都是指的是整个数组

而&数组名则代表的是取出该数组的整个地址,但是我们一般还是用首元素的地址来代表这个&数组名的值,而不同的则是&数组名在加减整数时候是跳过整个数组的地址

3数组传参与指针传参

       一维数组的传参

        当我们使用一维数组传参的时候,我们可以用什么类型来接收呢?

        

二维数组的传参的时候,当使用数组的时候需要注意数组的列是不能够省略的,二位数组传参的时候是传的一位数组的地址,所以我们可以用数组指针来接收 

指针传参

        当我们使用指针传参的时候我们也可以用指针来接受指针。

一 个 函 数 的 参 数 部 分 为 一 级 指 针 的 时 候 , 函 数 能 接 收 什 么 参 数 ?

        数组名,传一级指针。

二级指针

        我们可以传一级指针的地址,也可以传二级指针

        反正无论怎么样,我们都需要具体问题具体分析,看传的是啥,则我们用啥接受。

        

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值