浅梳所学内容

浅析所学指针内容(一)

  1. 指针是什么?
  2. 指针延申?
  3. 指针的意义是什么?
  4. 指针的修改。
  5. 什么是野指针?
  6. 指针能运算吗?
  7. 指针的使用。

问题解答1:

我们知道当我们计算机读取数据时是如何读取的呢?是通过访问内存读取的,较准确来说是通过读取内存单元的地址来访问的。

而这,C语言中把这个地址赋予了一个新名字叫做——指针。

所以,我们可以理解为:地址==指针

问题解答2:

既然我们知道指针==地址之后,那我们要拿到地址,要如何拿呢?这里就用到了地址操作符(&

既然地址拿到了,那我们就要存放,方便后期使用。那我们要怎么存放?存放给谁?存放到指针变量中。

指针变量也是变量,是用来存放地址的。

那int *p=&a;是什么意思呢?解剖一下:
p:是指针变量 *:是说明p是指针 int:是说p指向对象类型是整型。

现在,我把地址存放到了指针变量中,那么要怎么使用它呢?

这里就要用到解引用操作符(*),操作之怎样的呢?

既然指针==地址,并且还是用二进制存放的。那么就考虑到它是由大小的。

那么指针的大小是这样描述的:

1.32位平台下地址是32个bit位,指针变量⼤⼩是4个字节。

2.64位平台下地址是64个bit位,指针变量⼤⼩是8个字节。

问题解答3:

存在即合理,那么指针的意义是什么呢?

  1. 指针的类型决定了你一次可以操作多少个字节(相当于给了多大权限给你)比如:char*类型一次就操作一个字节,int*类型一次就操作两个字节。
  2. 指针的类型还决定了前进或后退一步有多大距离。
  3. 特殊指针:空指针(void*)

可以理解位无具体类型的指针,也称泛指针。好处是可以存放各种类型的的指针,但不能在里面进行解引用和指针+-整数(即指针运算);

问题解答4:

既然指针变量是一个变量,那就有存在被修改的可能性。那我不想修改呢?那我们使用这个const关键字,如何操作呢?

情况一说明:

当const放到*左边时,它代表的意思是:指针变量p指向的指针变量的内容不可以改变。

情况二说明:

当const放到*右边时,它代表的意思是:指针变量p指向的内容可以被修改,但p的内容不可修改。

问题解答5:

那指针指向一个位置的,那当我们指针指向的位置不明确时,会怎样呢?这时候就会产生一个东西叫——野指针

概念:指针指向的位置不可知的

什么样的情况会产生呢?

那规避的方法是什么呢?

既然提到检查指针有效性,那如何检查呢?

这就引入了一个库函数<assert.h>,里面的assert函数可以检查指针是否有效,(表达式为真就不会起作用,表达式为假,就会报错,在标准错误 流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号)使用方法如下

问题解答6:

指针当然可以运算!

主要有三种方式

  1. 指针+-整数。
  2. 指针-指针。
  3. 指针关系运算

问题解答7:

讲到这,指针到底是怎样使用呢?

举个例子,当我们创建个函数是其进行数值交换,假设我们不用指针实现,当我们完成这个函数,然后运行发现,两个数并没有交换,这是因为,不用指针的时候,函数调用是传值调用,

传值调用会有这样的作用:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。

这时候如果我们是传址调用的话,就会发现,修改形参,实参也会跟着改变。这时候指针就派上用场了,利用指针的话,就可以顺利的交换两个数字了。

浅析所学指针内容(二):

  1. 指针进一步理解
  2. 什么是二级指针?
  3. 指针延申类型。
  4. 二维数组的传参本质。

问题解答(二)1:

既然我们知道指针就是地址,指针变量是存放地址。那么是如何存放的呢?

以数组来举例,当我们取出数组的地址放到指针变量里面时,它是会把整个数组里的元素都存进指针变量里面去吗?不会。因为我们知道数组的里面的元素在内存是连续存放的,同时数组名还代表着首元素的地址,所以,当我们将第一个元素地址存在指针变量里面,这样当我们想找第二个元素的时候,我们知道第一个元素地址后就顺藤摸瓜找到第二个了。

同理字符串也是这样存储的,把它理解为数组就行。

到这里,我们就可以想象下,当我们将数组传参的时候传给一个函数时,是将首元素的地址传给函数。

问题解答(二)2:

我们讲到前面的指针是一级指针。那有一级指针就会有二级指针,

那么二级指针就是将一级指针的指针变量存在这里面。因为,既然是指针变量,那么变量就会有地址。

格式如下:

可以这样理解:**s先找的的是p,在对其解引用就会a。

问题解答(二)3:

涉及到指针的还有:

  1. 指针数组

本义上还是数组,只不过数组里面存放的是指针

用法如下:

数组里面放的是地址,那么每个元素又可以指向另一块区域。

类似的还有有指针函数。

  1. 数组指针

本义上还是指针,只不过这次是指针指向的是数组。

类似的还有函数指针,书写格式分别如下:

int (*s)(int,int);这里的int 、(*s)以及(int,int)分别指的是

返回类型、函数指针变量、s指向函数交代的类型和个数。

3.函数指针数组
可以理解为,数组里存放的是指针,而指针指向的是函数,书写格式如下:

arr先和[]结合,说明是数组。

数组的内容就是int (*)()函数指针。

问题解答(二)4:

首先再次理解下二维数组,二维数组每个元素就是一个一维数组。

而且二位数组的在内存中之这样的存放的:

假设二维数组是:arr[2][3]={1,2,3,4,5,6};

1

2

3

4

5

6

那么参照一维数组,所以二维数组的传参是:二维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址。

浅析指针所学内容(三)

  1. 什么是回调函数?
  2. Strlensizeof的对比。

问题解答(三)1:

回调函数就是⼀个通过函数指针调⽤的函数。

如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。

问题解答(三)2:

Sizof操作符是计算变量所占内存的大小,单位是字节,如果计算的是类型的话,就是计算使用类型创建变量的大小。

它只关注占用内存的大小,不在乎内存里放什么数据。

Strlen是一个库函数,作用是就字符串的长度。

它会遇到\0就会停止,但会存在越界查找。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值