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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈旧 于 2016-1-22 14:20 编辑

我的天,之前打的全都没保存,熬夜做的全程泡沫!!!   今天把指针的大部分学习完了,我是一个完全没有基础的小白,但是就最近两天对指针的学习而言完全没有大家说的那种晕头转向的感觉,下面做一下简单总结,来吧这段时间所学到的东西搞一下.
希望各位大神多帮帮小白,让小白早日挤进码神世界!
ok  正题开始
在学习指针之前呢我对函数的理解很不好然后又学习 指针函数   函数指针  感觉有点吃力
但是在学习过程中要多练习多总结,脑子里还要形成一种三维的画面感,让整个环境还有运行的场景在脑子里描绘出来这样就很容易弄懂啦\
___________________________________________________________________我是分割线_______________________________________________________________________________
指针就是一个能存地址的数据类型这句话没错吧哈哈
怎么用呢:
    定义
        指针类型 *指针名;  int a = 1; int *p = &a;
    赋值
        指针名 = 地址;  p = a的地址;
    操作
        1.对指针的操作    根据数据的类型确定字节数 比如 在64位操作系统下 int 占 4个字节   double 占 8 个字节
            1.向高位移动(+) :如:p+1(p本身没有),++p(p本身发生变化);
            2.向低位移动(-) :如:p-1;--p;
        2.对指针所指空间的操作
            1.取值 如:*p
            2.赋值 如:*p=值
下面大体总结了 5种  因为目前就学了这5种
1.指针与基本数据类型(int char double float)
    我们来举个例子:
        定义:int *p;
        赋值:int a=1; p=&a;
        操作:
            1.对指针的操作
                *对数据本身无意义.(越界了)
            2.对指针所指空间的操作
                1.取值
                    int b=*p;
                2.赋值
                    *p=3;
2.与其他的数据类型
数组
    int hei[4]={1,2,3,4};         我比较喜欢用   用第一个元素的指针  这样指针运算很方便. 也不会很绕      
     定义并赋值:
             int *p=hei;或者:int *p=&hei[0];    (数组名就是第一个元素的地址)
        具体操作:
            1.对指针的操作:  
                1.向地址名称大的位置移动(+): p+1(p本身不变),++p(p的位置发生变化);
                2.向地址名称小的位置移动(-): p-1,--p; (--也是一样)
            2.指针所指向空间的操作
                1.如何取值:
                    取第一个元素的值: *p或p[0];
                    取下一个元素的值: *(p+1);或p[1](等同于:p[当前脚标+1]);
                    取上一个元素的值: *(p-1);或p[-1](等同于:p[当前脚标-1]);
                2.赋值:
                    给第一个元素赋值:*p=2,; 或p[0]=2;
                    给下一个元素赋值:*(p+1)=3;或p[1]=3;
                    给上一个元素赋值:*(p-1)=5;或p[-1]=5;
                    [注意]  设定的是哪一个脚标,容易搞混
      经典面试题.
      下面打印出来的结果是什么?答案:2,5
      int a[] = {1, 2, 3, 4, 5};
      int *p = (int*)(&a + 1);         小心掉坑里面,这里是整个数组的地址,所以移动的是整个数组的字节数 然后转换成int 型  减 4 个字节 所以是 5 哦

       printf("%d, %d\n", *(a+1), *(p-1));     要多多注意
再就是 整个数组的指针
        定义并赋值:
            int (*p)[3]=&arr;   注意哦 这里是整个数组的地址 而不是第一个元素的
        具体操作:
            1.对指针的操作   对数组本身无意义
                1.向高位移动(+): p+1,p++;
                2.向低位移动(-): p-1,p--;
            2.对指针所指空间的操作
                1.取值: (*p)[角标],等效于arr[角标];   注意这里要加  括号    ()
                        或:*((*p)+1);等效于*(arr+1);  这样写很容易弄错
                2.赋值: (*p)[角标]=2;
3.指针与指针类型
        定义并赋值:
                   int a=0;       int *p1=&a;      int **p=&p1;
        具体操作:
            1.指针            对指针本身无意义                           2.指针所指向空间的操作
                1.向高位移动(+): p+1,p++;                                 1.取值:    一级指针取值:    *p;  (取的是p1的值)  ||||||   二级指针取值:   **p;   (取的是a的值)
                2.向低位移动(-): p-1,p--;                                     2.赋值:    *p=&p1;      **p=5;    
            2.指针所指向空间的操
                1.取值:    一级指针取值:    *p;  (取的是p1的值)  ||||||   二级指针取值:   **p;   (取的是a的值)
                2.赋值:    *p=&p1;      **p=5;    
             先说这么多,后面就是 指针与 字符串,还有函数               小子也是不容易的,还请多多奖励呀   

34 个回复

正序浏览
受益~~~~~~~~
回复 使用道具 举报
赞啊学习学习
回复 使用道具 举报
指针不是数据类型啊
回复 使用道具 举报
beyonehan 发表于 2016-2-3 22:03
第一句话,指针就是一个能存地址的数据类型,指针应该是地址吧

不是地址啊!!
回复 使用道具 举报
第一句话,指针就是一个能存地址的数据类型,指针应该是地址吧
回复 使用道具 举报

谢谢谢谢   
回复 使用道具 举报
不错,学习一下!
回复 使用道具 举报
学习学习!
回复 使用道具 举报
世年单 发表于 2016-2-1 22:27
棒棒的,写的很细

谢谢思密达
回复 使用道具 举报
棒棒的,写的很细
回复 使用道具 举报
学习学习!
回复 使用道具 举报

谢谢  谢谢
回复 使用道具 举报
wanghui001001 发表于 2016-1-30 10:02
好吧,学习了,这个还真不知道
视频中有讲嘛?

翁发达的有讲 ,如意的应该也有吧  
回复 使用道具 举报
石门一梦 来自手机 中级黑马 2016-2-1 15:05:35
22#
不错!               
回复 使用道具 举报
加油
回复 使用道具 举报
不错不错!!!
回复 使用道具 举报
陈旧 发表于 2016-1-29 23:12
a代表的是数组首元素的地址,也就等同于   a==&a[0]   这里用%p 来分别打印他两个 结果值是一样的
但是 & ...

好吧,学习了,这个还真不知道
视频中有讲嘛?
回复 使用道具 举报
指针的总结(具体5类)[后半部分] http://bbs.itheima.com/thread-275542-1-1.html (出处: 黑马程序员IT技术论坛)
回复 使用道具 举报
Zhangqi27 发表于 2016-1-29 17:43
真的非常有用处,我先收藏了,等静心下来好好学。

谢谢支持
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马