A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 约吗^_^ 中级黑马   /  2015-11-12 07:57  /  986 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、什么是指针?
二、指针的定义
三、指针的用途举例
四、关于指针的疑问

一、什么是指针?
        
        比如说我们到图书馆想要找到我们需要的书,那么一定是通过电脑根据书名来查看所需要的图书在图书馆的几层几排几号,然后你就可以直接到相应的书架上找到所需的图书。在C语言中,这里的书名就相当于是一个指针,几层几排几号就相当于是这个指针所指向的地址,那么这个地址中所存储的图书就相当于指针所指向这个地址的内存空间中的数据。
        
二、指针的定义
定义:类型标识符 *指针变量名,如:
  • int *p;
  • char *c;

  • “*”是一个说明符,用来说明这个变量是一个指针变量,是不能省略的,它属于变量的一部分。
  • 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。


三、指针的用途举例

例1:
        在学指针前,我们在进行基本运算时,需取出相应方法的返回值,且一个方法只能得到一个返回值,利用指针后,即使方法无返回值,也能同时计算出多个不同公式的计算结果:

  • #include <stdio.h>
  • void jisuan(int *a, int *b, int *cheng, int *chu);
  • int main() {
  •     int a = 5, b = 8, cheng, chu;
  •     jisuan(&a, &b, &cheng, &chu);
  •     printf("sum = %d\n", a);
  •     printf("jian = %d\n", b);
  •     printf("cheng = %d\n", cheng);
  •     printf("chu = %d\n", chu);
  •    
  •     // 已知int a = 5; int *p = &a;情输出指针本身的地址,及指针的值,及其所指向内存空间的值。
  •     int *p = &a;
  •     printf("*p的地址:%p,指针的值:%p,所指向内存空间的值:%d\n",&p, p, *p);
  •    
  •     return 0;
  • }
  • // 实现两个整数的加减乘除
  • void jisuan(int *a, int *b, int *cheng, int *chu) {
  •     *a = *a + *b;
  •     *b = *a - *b;
  •     *cheng = *a * *b;
  •     *chu = (*a) / (*b);
  • }

因此,有了指针,我们可以让函数有“无限个”返回值。

四、关于指针的疑问

1. 不同编译环境下,一个指针变量占用的内存空间是多少?

16位编译环境32位编译环境64位编译环境
int248
void *(指针变量)248

2. 既然每个指针变量所占用的内存空间是一样的,而且存储的都是地址,那为什么指针变量还要份类型?而且只能指向一种类型的变量?比如指向int类型的指针、指向char类型的指针。

这个就跟在不同编译器下不同类型的数据所占的内存不同有关了,如int类型在64位编译器下占4个字节,char类型占1个字节,那么int类型的地址则是4个不同字节地址中的低位地址,而char类型只占一个字节,如果我们用int类型的指针变量指向char类型的地址,那么int类型的指针就会从char类型的地址往上读取3个字节的数据,但我们不知道另外3个字节存储的内容,所有取出来的值是不准确的。


1 个回复

倒序浏览
很不错的,谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马