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 个回复

倒序浏览
李松涛 来自手机 中级黑马 2016-1-22 22:39:49
沙发
不错……
回复 使用道具 举报
guyuexing 来自手机 中级黑马 2016-1-25 19:37:39
藤椅
加油,学习了
回复 使用道具 举报
加油加油 学习了
回复 使用道具 举报

谢谢谢谢

回复 使用道具 举报

谢谢 谢谢
回复 使用道具 举报
陈旧 中级黑马 2016-1-25 22:32:40
7#

谢谢谢谢
回复 使用道具 举报
陈旧 中级黑马 2016-1-25 22:37:38
8#

谢谢谢谢
回复 使用道具 举报
加油!              
回复 使用道具 举报
挺好的,加油
回复 使用道具 举报

谢谢美女哦
回复 使用道具 举报
int a[] = {1, 2, 3, 4, 5};
        int *p = (int*)(&a + 1);
        printf("%d, %d\n", *(a+1), *(p-1));        
哪个大神解释下,为什么输出5
回复 使用道具 举报
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个字节
回复 使用道具 举报
我想问一下int *p = (int*)(&a + 1);  
中间a不就是数组的首地址嘛,&a等于说是整个数组的地址?还可以这样?
回复 使用道具 举报
真的非常有用处,我先收藏了,等静心下来好好学。
回复 使用道具 举报
wanghui001001 发表于 2016-1-29 15:55
我想问一下int *p = (int*)(&a + 1);  
中间a不就是数组的首地址嘛,&a等于说是整个数组的地址?还可以这样 ...

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

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

好吧,学习了,这个还真不知道
视频中有讲嘛?
回复 使用道具 举报
不错不错!!!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马