关于指针

关于指针

1. 什么是指针

指针是一种保存变量地址的变量

2. 指针存在的形式

   指针类型,指针类型的变量和指针类型的值【在c中有int的类型,自然有int的变量和int的值】

3. 指针类型的值

   指的是内存的地址【类似于门牌号】

4. 进行代码演示

   

运行结果

 

对代码分析

定义int

定义 int

定义 int型的指针【注这里定义的变量是hoge_p不是*hoge_p

为什么写成int *hoge_p不写成int*hoge_p

     因为区别 int *hoge_p,i;//这里hoge_p是指针变量,i是整型变量

              Int* hoge_p,i;//没有办法区别】

通过取地址符【&】将地址取出  %p转义字符:输出地址

.................................................

................................................

赋予指针变量内容为hoge的地址【hoge_p保存着hoge的地址】

...................................................

通过指针运算符*hoge_p的内容取出【即hoge_p指向对象】

通过指针修改变量的值【将hoge_p指向对象的值改变,即改变hoge的值】

                              注:以上代码来源于《征服c指针》如侵权,请告知立删

5. &hoge 有时候称hoge的地址的值为指向hoge的指针【这里的指针指指针类型的值】

要点:

1. 指针变量hoge_p保存了指向其他变量的地址情况下,可以说hoge_p指向hoge

2. 通过*指针运算符输出内容,其实是间接输出,称为解引用

 

 

6. 指针和地址之间的微妙关系

几乎所有处理的程序中,所谓的“指针类型的值”实际是指内存的地址

   1.通过在int类型的变量加上&来取得它得指针,随后利用指针间接取出地值一定是int型不会是double型,因为intdouble的内部表示不同,所以不可以定义int 型的指针类型来保存double型变量的地址

 

7. 指针运算

指针运算是对指针进行整数加减运算,以及指针之间的减法运算

 

代码演示

#include <stdio.h>

 

int main(){

int hoge;

int *hoge_p;

//将指向 hoge的指针赋予hoge_p

hoge_p=&hoge;

//输出hoge_p的值

printf("hoge_p.....%p\n",hoge_p);

//hoge_p加上1

hoge_p++;

//输出hoge_p的值

printf("hoge_p...%p\n",hoge_p);

//加上3之后的值

printf("hoge_p...%p\n",hoge_p+3);

return 0;

}

运行结果

 

对运行结果分析

Hoge++,地址+4hoge+3地址+3*4cfreeint型长度为4

 c语言中,对指针进行加上1运算,地址的值会增加当前指针所指的数据类型的长度

8. 什么是空指针

空指针是一个特殊的指针指。【是指可以确保没有指向任何一个对象的指针。通常使用宏定义NULL来表示空指针常量值】

前文提到 所以不可以定义int 型的指针类型来保存double型变量的地址

但是只有NULL无论对方指向什么类型的变量,都可以被赋值和比较

 

9. NULL  0   \0\

Int *p=0;

这里没有警告可以编译,【在c语言中,当常量0处于应该作为指针使用的上下文中是,0被当作空指针使用】

 

以下这些情况编译器理解不了上述情况

 1.没有原型声明的函数的参数【只有确实做了原型声明的情况下,编译器才能知道你想要传递指针

 2.可变长参数函数中的可变部分的参数【以printf()为代表的可变长参数函数,其可变部分的参数的类型编译器是不能理解

 

10. 实践体验指针的奥妙

   代码及运行结果

 

   

//可以看到ab并没有如预想的那样交换值

【解释如下

  c中有变量的作用域

1. 在函数外定义的变量,拥有文件作用域,在函数内定义的变量,拥有块作用域

2. 如果两个同名变量拥有不同的作用域,那么内层的变量是可见的,而外层的变量是会隐藏起来的。

     c中有实参和形参之分

1. 实参:是调用函数时的参数    fune(5);【这里的5就是实参】

2. 形参:是接受实参的一方  int swap(int a,int b)  【这里的a,b就是形参】

调用函数时发生

  a=5,b=10传到swap(int a,int b)ab中,这里仅仅时传递了510(实参)

  swap函数里510进行交换,并没有影响到main函数中ab的值

 

对代码进行修改

 

 

分析

这段代码采取了传递指针的方式

解释

   1.调用函数swap(&a,&b)这里传给swap函数的是ab的地址

   2.swap函数定义的形参都是int型的指针用来接受地址

   3.通过解引用*间接对ab进行交换

 

11. 关于数组

   代码分析

 

注意:数组在内存里的排布是以0开始

12. 数组与指针的微妙关系

  与前文c语言中,对指针进行加上1运算,地址的值会增加当前指针所指的数据类型的长度【类推给n

指向数组的某个元素的指针加上N,指针会指向N个之后的元素

代码演示

分析

 定义int 的指针

  P=&array[0]【这个指针指向数组的首地址】

13. 【】与数组的关系

没有关系【这里也是c的数组下标从0开始的原因

要点:

表代式中,数组可以解释为指向它的初始元素的的指针和后面加的【】无关

P[i]*(p+i)为简便写法

补充:

P[i]*p+i)的简单写法,因为后者不好理解,就加入了【】实际上【】并没有什么作用,这种情况被成为语法糖

  

   1.下标访问也就是指针运算+解引用运算符

14. 试图将数组作为函数的参数进行传递【太难还未搞懂】

   要点

无论如何都要将数组进行值传递的时候,建议将数组整体整理称结构踢成员

                              

 

注:本篇笔记部分来源于《征服c指针》一书,如侵权,请告知立删

                                                        笔记2017.11.08 1543

 

 

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值