C语言指针

原创 2015年11月17日 20:14:08

计算机中,存储单元的相互转换:

         1G = 1024M;   1M = 1024K;   1K = 1024B;   (1B = 8个位)

         char       1个字节      1个内存单元

         short      2个字节      2个内存单元

         int        4个字节      4个内存单元

         long       4/8个字节    4/8个内存单元

         float      4个字节      4个内存单元

         double     8个字节      8个内存单元

字节和位:

字节:是最小的存储单元,一个字节被称为一个存储单元(也叫做内存单元);不同的数据类型占的存储单元也不相同;

位:一个字节右称作8位,为了正确访问内存单元,每个内存单元都有一个编号,内存单元的编号被称作地址;

内存地址 == 地址 == 内存单元编号;内存单元中的数据才是我们要关注的内容;


指针:即内存地址,简称为地址;

& 和 *

&,“and",取址符,可以查看一个变量的内存地址(首地址),用 %p 格式化输出内存地址;


int a = 998;

        printf("&a = %p\n",&a);


注意:&取出来的内存地址,并不是变量只占用一个内存地址,变量的数据类型决定变量占用几个内存地址;

* 取值符,顾名思义,通过‘*‘来访问内存单元中存储的数据;

指针变量:存放内存地址的变量

     基本数据类型 *变量名 = 内存地址;


*p = 100;

        printf("%d\n",a);


如果出现*号的地方有类型修饰符(int,char,float),此时*只起到标示作用,告诉编译器就是一个指针变量;

        *j = 337;

如果出现*的地方没有任何类型修饰符,此时*代表取值操作符,他会把指针指向的区域内的值取出来;

如果前面没有*和内存修饰符,那么这个变量就是指针变量,他里面存储着一个内存地址;


指针赋值:C语言允许使用赋值运算符对指针进行赋值,前提是两个指针具有相同的数据类型;


    int i,*p,*q;

        p = &i;

        q = &j;

        i = 1;

        *p = *q;

        printf("%d\n%d\n%d\n",i,*p,*q);

指针变量所占的字节数,只与 操作系统 位数有关;64位操作系统指针变量占8位,32位占4位;


以上是指针初级,下面是深入了解:

数组的内存地址:在C语言中数组是构造类型,数组会分配一段连续的内存空间来存储数组的全部数据;数组名代表数组首个元素的地址;

指针与数组的区别:

     所占空间不同:

     指针:只与操作系统位数有关;

     数组:与元素个数和数据类型有关;

     数组名是常量地址,不能被赋值,不能重定向

     指针可以重定向;

指针变量parray相同,都指向数组第一个元素的内存地址;

        printf("%d\n",*(p+1));

       (p+1)的内部实现是:p是数组元素的首地址,p+(1*int(当前数据类型所占的字节数));操作的是内存地址;

       (p+1)= p+1*当前数组的类型所占的字节数)

        printf("%p\n",p+1);

        printf("%d\n",*p+1);

        综上所述,*(p+1),是指数组的下标加1*p+1,是指数组的第一个值加1*p是数组的第一个元素的地址;

        下面四个结果都有一样,都是数组的第二个元素;

        p[1] == array[1] == *p+1) ==*(array +1);

        数组名是常量,不能被赋值,不能重定向;

        指针可以被重定向;

        数组是不能被直接赋值的,数组名代表元素首地址,数组是常量地址,不能被改值,只能使用赋值字符串函数strcpy把值复制进去,或者把数组里面的元素都取出来赋值;



结构体指针变量指向的是结构体变量的首地址,也就是第一个成员的地址;

结构体数组与指针的关系:结构体数组的数组名是一个结构体指针的常量;


结构体指针比较复杂,我们看一个例子吧:



使用 指针 查找学员数组中 性别为男 的学员,成绩增加10,超过100分的记为100


       typedef struct st{

            char name[20];

            int age;

            char sex;

            int score;

        }Stu;

        

        

        Stu stude[4] = {

            {"jhbj",18,'m',56},

            {"bhkl",21,'w',96},

            {"dsff",23,'m',98},

            {"ghbi",21,'m',87}

        };

        Stu *p4 = stude;

       // p1 ->age

        for (int i = 0; i < 4; i++) {

            if ((p4+i)->sex == 'm') {

                (p4+i)->score+=10;

            }

            if ((p4+i)->score > 100) {

                (p4+i)->score = 100;

            }

        }

        for (int i = 0; i < 4; i++) {

        printf("%d\n",(p4+i)->score);

        };












       






         



版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言:详解指针

指针应该算得上是c语言的精华,但也是难点。很多教程或者博客都有对其详细的讲解与分析。我这一节的内容,也是讲解指针,但我会尽量使用图解的方式,使大家很容易理解及掌握。 一、基本使用 先来看看下面的代码:...
  • sinat_27706697
  • sinat_27706697
  • 2015年08月22日 09:58
  • 20425

C语言中指针的几种用法

大家都知道指针是C语言中的精髓,它能直接对物理地址进行访问,具有双重功能,是嵌入式设计中必不可少的一门语言。C语言功能强大的主要原因就是具有指针结构。指针是一种特殊的数据类型,直接指向目标的存储地址,...
  • zhl254467014
  • zhl254467014
  • 2015年03月19日 13:42
  • 25645

C语言(彻底理解指针和地址,彻底!)

天啊!为什么你学了3年还是无法正确理解指针地址的概念?别扯淡你一看C语言就懵逼,琢磨LOL英雄属性你挺6啊!   拓展: 有人一提到指针地址,就会一脸懵逼,因为在他们的脑海中,指针的...
  • vincent040
  • vincent040
  • 2016年04月06日 10:26
  • 6563

C语言--指针用法详解

C语言指针用法详解 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字...
  • u010070526
  • u010070526
  • 2014年12月06日 22:14
  • 10139

c语言面试题 指针30个常错题型

来源:http://blog.chinaunix.net/u1/58640/showart.php?id=1354073 记下来以备不时之需。 1. char * const p; char cons...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2013年12月28日 20:54
  • 20156

C语言指针教程----入门到精通<一>

有一个传说,指针是C语言的精髓;可同时,指针似乎也是C中很难理解的一部分。博主希望在自己复习的同时,写出一些学习心得和体会,供大家讨论。...
  • u014254779
  • u014254779
  • 2014年09月04日 12:39
  • 2343

C语言-指针操作

0.引入 在C语言中,
  • universe_ant
  • universe_ant
  • 2016年11月30日 23:29
  • 1685

C语言指针总结

指针一直是学习C/C++语言的一个重点与难点。只有熟练地掌握了指针,才可以说掌握了C语言,C语言的最吸引人的地方也是指针,因为它可以任意地操作内存,编写程序中有着极大地自由空间,因此,也有人说指针是C...
  • u010925938
  • u010925938
  • 2016年04月03日 10:14
  • 4612

C语言 FILE文件指针

struct_iobuf{ char*_ptr; int _cnt; char*_base; int _flag; ...
  • xi_niuniu
  • xi_niuniu
  • 2015年05月24日 22:48
  • 2214

C语言教学--二维数组和指针的理解

对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻.   我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的...
  • lovesummerforever
  • lovesummerforever
  • 2013年11月14日 13:58
  • 8061
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言指针
举报原因:
原因补充:

(最多只允许输入30个字)