标签:
大家好, 今天我们来学习C语言中的指针. 可能大家都听过这么一句话: C语言中其它我学得都很好, 就是指针这一块学得不是太明白, 那么你不如告诉我你没有学过C语言. 这么一句话突出了指针这个概念在C语言当中的重要性. 还有的同学说, 我听别从说C语言当中的指针好难, 特别难理解, 很难学会.那么我告诉大家的是, 指针没有什么难的地方, 那只是你们潜意识这么认为的, 通过今天这节课的学习, 我相信大家都能学会指针, 并且会用指针. 好, 下面开始指针的学习.
在学指针之前, 我先给大家普及一下, 基本的知识, 基本的概念. 1.什么是内存空间? 2.什么是地址? 3.什么是直接访问? 4.什么是间接访问?
1. 什么是内存空间? 什么是地址?
顾名思义: 就是存储数据的空间. 我们暂且认为字节是最小的存储单元, 而我们的内存空间就是有很多个字节组成的. 例如: 2G内存 = 2的31次幂-1个字节组成的. 我们对一个个的字节进行编号, 每一个字节都一个编号, 而字节的编号, 也就是内存单元的编号, 就是内存地址.
我们可以举一个生活当中的例子啊, 如: 电影院就相当于一块内存, 而电影院中是有很多个座位组成的, 而一个个的座位就相当于内存中的字节, 而我们也对一个个的座位进行编号, 每一个座位都有一个编号, 而每一个座位的编号, 就相当于内存的地址.
2. 什么是直接访问? 代码:
int a; // 我们在内存中申请了一块内存空间, 并且名为a, 存储的类型为整型
a = 5; // 对刚才申请的内存空间进行初始化, 并且存储内容为整型 5
char c; // 我们在内存中申请了一块内存空间, 并且名为c, 存储的类型为字符型
c = ‘A‘; // 对刚才的内存空间进行初始化, 并且存储内容为字符 A
a = 10; // 更改存储内容为10 (数据的写入)
printf("%d\n", a); (数据的读取)
定义: 我们直接通过变量名来访问对应的存储空间(数据的读取与写入)
图:
地址 内存空间
ffc1 a = 5
ffc5 c = ‘A‘
3. 什么是间接访问? 定义: 我们通过内存地址, 以及变量所占字节数的大小, 来访问存储空间中的内容.
地址 内存空间
ffc1 a = 5 // ffc1是变量a的内存地址, 所占字节数的大小为4个字节
ffc2
ffc3
ffc4
4. 我们怎么得到一个变量的地址? 那么就涉及到一个运算符: 取址运算符(&)
&a; // 这样我们就得到了变量a的内存地址
// 我们得到了一个内存地址, 那么怎么去打印它呢?
printf("%p\n", &a); // %p 我们通过指针的格式化输出符%p, 来打印一个地址
// 那么总是来了, 我们怎么通过内存地址和所占字节数的大小, 来访问一块内存空间, 然后打印出来? 这就用到了我们今天要讲的内容指针?
5. 什么是指针? 指针的定义? 指针的初始化?
6. 什么是指针? 举两个生活当中的例子 1). 比如上面我们举的电影院的例子, 我们去电影院看电影都有一张电影票对吧, 电影票上有我们的座位号, 我们可以通过座位号来找到我们的座位, 那么我现在就说, 这张电影票就是指针. 2) 我们举一个例子可能有点少对吧, 那么我们现在再举一个例子, 假如你来找我借书, 但是我不在, 但是我在桌子上给你留了一张纸条, 上面告诉你我的书在书架第二层的第三本就是你要借的书, 你通过这个纸条就可以找到你要借的书了对吧, 那么现在我告诉你, 这张纸条就是指针.
那么我们C语言当中的指针是怎么定义的呢? 定义: 存放变量地址的变量, 就是指针. 那么我们怎么去定义一个指针呢?
int * p; // 好, 现在我们就定义了一个指针, 大家一看, 哇, 好难啊, 怎么多了一个*号, 那么我告诉大家不难, 为什么不难, 听我解释. 首先, 它也是一个变量, 它跟我们之前定义的变量, 没有什么本质上的区别, 这的*号只是表明, 我们现在定义的是一个指针变量.
图:
地址 内存空间
ffc1 a = 5
ffc5 p=ffc1
大家通过这个图可以看到指针变量也是有地址的, 也是有内存空间的, 跟我们上面定义的变量一样. 而它与我们上面定义的变量不一样的地方就是, 它存储内容是和上面的变量不一样的.我们上面提到了, 指针变量的存储内容是地址对吧, 那么我们怎么去把地址取出来, 赋值给指针变量呢? 这就涉及到的指针的初始化?
7. 指针的初始化?
p = &a; // 这句话表示, 我们取出变量a的地址赋值给指针变量p, 这样我们就完成了指针的初始化, 也叫做指针变量p指向了变量a.
那么我们去通过指针去间接的访问内存空间呢? 那么就会用到*(取值运算符) 它的作用就是取得地址所对应存储空间中的内容.
8. *p; // 这句话的意思就是取得指针p(变量a的地址)所对应的存储空间 5
printf("%d\n", *p); // 输出值为5 通过指针间接的读取数据
// 我们可以跟之前的例子做个对比啊, 这的指针变量p, 相当于我们之前的纸条, 而p的值, 相当于纸条上的内容, 而变量a所对应的存储空间, 就是我们要找的 书好吧, 这样说大家明白了吧?
*p = 10; // 通过指针间接的写入数据
9. 指针的重指向?
我们都知道一个变量的值, 是可以改变的, 那指针指向的位置可不可以改变呢? 可以, 而这叫指针的重指向.
int b = 20;
p = &b;
printf("%d\n", *p); // 现在我们的指针变量指向了变量b, 所以打印出的结果为20
10. 指针的注意事项
int * p;
1. p = 100; // 错误: 我们的p是一个指针变量, 它存放的是一个地址, 而100是一个常量
2. *p = 100; // 错误: 我们的p只是进行了定义, 还没有对它进行初始化, 也就是不知道它指向的是哪一块内容, 而我们却冒然的去改变它的值
3. 指针所占的字节数? 指针所占字节数的大小与类型无关, 与编译器的位数有关, 32bit编译器环境, 指针占4个字节, 64bit编译器环境, 指针占8个字节
4. 为什么指针要定义类型? 指针要指向跟它同一类型的变量, 否则读取的数据就会出现错误.
标签:
原文地址:http://www.cnblogs.com/ZeroHour/p/4331079.html