本帖最后由 陈旧 于 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; 先说这么多,后面就是 指针与 字符串,还有函数 小子也是不容易的,还请多多奖励呀
|