关于指针
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型,因为int和double的内部表示不同,所以不可以定义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++,地址+4,hoge+3地址+3*4【cfree的int型长度为4】
在c语言中,对指针进行加上1运算,地址的值会增加当前指针所指的数据类型的长度
8. 什么是空指针
空指针是一个特殊的指针指。【是指可以确保没有指向任何一个对象的指针。通常使用宏定义NULL来表示空指针常量值】
前文提到 所以不可以定义int 型的指针类型来保存double型变量的地址
但是只有NULL无论对方指向什么类型的变量,都可以被赋值和比较
9. NULL 0 ’\0\’
Int *p=0;
这里没有警告可以编译,【在c语言中,当常量0处于应该作为指针使用的上下文中是,0被当作空指针使用】
以下这些情况编译器理解不了上述情况
1.没有原型声明的函数的参数【只有确实做了原型声明的情况下,编译器才能知道你想要传递指针
2.可变长参数函数中的可变部分的参数【以printf()为代表的可变长参数函数,其可变部分的参数的类型编译器是不能理解
10. 实践体验指针的奥妙
代码及运行结果
//可以看到a与b并没有如预想的那样交换值
【解释如下
在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)的a与b中,这里仅仅时传递了5和10(实参)
在swap函数里5与10进行交换,并没有影响到main函数中a与b的值
对代码进行修改
分析
这段代码采取了传递指针的方式
【解释
1.调用函数swap(&a,&b)这里传给swap函数的是a与b的地址
2.swap函数定义的形参都是int型的指针用来接受地址
3.通过解引用*间接对a与b进行交换
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 15:43