黑马程序员技术交流社区

标题: 指针的总结(具体5类)[前半部分] [打印本页]

作者: 陈旧    时间: 2016-1-22 14:20
标题: 指针的总结(具体5类)[前半部分]
本帖最后由 陈旧 于 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;    
             先说这么多,后面就是 指针与 字符串,还有函数               小子也是不容易的,还请多多奖励呀   


作者: 李松涛    时间: 2016-1-22 22:39
不错……

作者: guyuexing    时间: 2016-1-25 19:37
加油,学习了
作者: 水丹青    时间: 2016-1-25 21:47
加油加油 学习了
作者: 陈旧    时间: 2016-1-25 22:30
水丹青 发表于 2016-1-25 21:47
加油加油 学习了

谢谢谢谢


作者: 陈旧    时间: 2016-1-25 22:31
guyuexing 发表于 2016-1-25 19:37
加油,学习了

谢谢 谢谢
作者: 陈旧    时间: 2016-1-25 22:32
李松涛 发表于 2016-1-22 22:39
不错……

谢谢谢谢
作者: 陈旧    时间: 2016-1-25 22:37
水丹青 发表于 2016-1-25 21:47
加油加油 学习了

谢谢谢谢
作者: 石门一梦    时间: 2016-1-26 10:19
加油!              
作者: songxiuling    时间: 2016-1-26 16:23
挺好的,加油
作者: 陈旧    时间: 2016-1-26 19:29
songxiuling 发表于 2016-1-26 16:23
挺好的,加油

谢谢美女哦
作者: cokeco    时间: 2016-1-27 19:53
int a[] = {1, 2, 3, 4, 5};
        int *p = (int*)(&a + 1);
        printf("%d, %d\n", *(a+1), *(p-1));        
哪个大神解释下,为什么输出5
作者: 陈旧    时间: 2016-1-27 22:42
cokeco 发表于 2016-1-27 19:53
int a[] = {1, 2, 3, 4, 5};
        int *p = (int*)(&a + 1);
        printf("%d, %d\n", *(a+1), *(p-1 ...

这是那个经典面试题吗?   
  下面打印出来的结果是什么?答案: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));     要多多注意
第二行是   (&a+1)   数组取地址   数组所占的  总字节数   整体向 高位移动      这里 5 个整形   所以占20个字节
作者: wanghui001001    时间: 2016-1-29 15:55
我想问一下int *p = (int*)(&a + 1);  
中间a不就是数组的首地址嘛,&a等于说是整个数组的地址?还可以这样?
作者: Zhangqi27    时间: 2016-1-29 17:43
真的非常有用处,我先收藏了,等静心下来好好学。
作者: 陈旧    时间: 2016-1-29 23:12
wanghui001001 发表于 2016-1-29 15:55
我想问一下int *p = (int*)(&a + 1);  
中间a不就是数组的首地址嘛,&a等于说是整个数组的地址?还可以这样 ...

a代表的是数组首元素的地址,也就等同于   a==&a[0]   这里用%p 来分别打印他两个 结果值是一样的
但是 &a代表的是数组本身的地址跟&a[0]是一个地址 但是意义完全不一样
作者: 陈旧    时间: 2016-1-29 23:13
Zhangqi27 发表于 2016-1-29 17:43
真的非常有用处,我先收藏了,等静心下来好好学。

谢谢支持
作者: 陈旧    时间: 2016-1-29 23:16
指针的总结(具体5类)[后半部分] http://bbs.itheima.com/thread-275542-1-1.html (出处: 黑马程序员IT技术论坛)
作者: wanghui001001    时间: 2016-1-30 10:02
陈旧 发表于 2016-1-29 23:12
a代表的是数组首元素的地址,也就等同于   a==&a[0]   这里用%p 来分别打印他两个 结果值是一样的
但是 & ...

好吧,学习了,这个还真不知道
视频中有讲嘛?
作者: 13631297627    时间: 2016-1-31 23:04
不错不错!!!
作者: 杨冬武    时间: 2016-2-1 12:44
加油
作者: 石门一梦    时间: 2016-2-1 15:05
不错!               
作者: 陈旧    时间: 2016-2-1 19:06
wanghui001001 发表于 2016-1-30 10:02
好吧,学习了,这个还真不知道
视频中有讲嘛?

翁发达的有讲 ,如意的应该也有吧  

作者: 陈旧    时间: 2016-2-1 19:35
石门一梦 发表于 2016-2-1 15:05
不错!

谢谢  谢谢
作者: chensc    时间: 2016-2-1 20:33
学习学习!
作者: 世年单    时间: 2016-2-1 22:27
棒棒的,写的很细
作者: 陈旧    时间: 2016-2-2 16:45
世年单 发表于 2016-2-1 22:27
棒棒的,写的很细

谢谢思密达

作者: chensc    时间: 2016-2-2 20:50
学习学习!
作者: Chris_Wu    时间: 2016-2-3 12:41
不错,学习一下!
作者: 陈旧    时间: 2016-2-3 13:19
chensc 发表于 2016-2-2 20:50
学习学习!

谢谢谢谢   
作者: beyonehan    时间: 2016-2-3 22:03
第一句话,指针就是一个能存地址的数据类型,指针应该是地址吧
作者: 陈旧    时间: 2016-2-4 21:33
beyonehan 发表于 2016-2-3 22:03
第一句话,指针就是一个能存地址的数据类型,指针应该是地址吧

不是地址啊!!
作者: beyonehan    时间: 2016-2-12 19:55
指针不是数据类型啊
作者: 大爱五花肉    时间: 2016-2-14 08:34
赞啊学习学习
作者: simon熊    时间: 2016-2-14 10:18
受益~~~~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2