码迷,mamicode.com
首页 > 其他好文 > 详细

指针初级(定义, 初始化, 重指向, 注意事项)

时间:2015-03-11 22:57:05      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

大家好, 今天我们来学习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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!