c语言学习之基础知识点介绍(十四):指针的进阶
一、指针的加、减法运算
/*
1、加法运算
1)、可以跟整数进行加法运算,得到的还是一个地址
公式:
地址 + 1 = 地址 + 1 * 类型所占的字节数
地址 + n = 地址 + n * 类型所占的字节数
2)、只能跟整数运算,不能跟浮点数运算 2、指针的减法运算:
1)、可以跟整数进行减法运算,得到的还是一个地址 公式:
地址 - 1 = 地址 - 1 * 类型所占的字节数 地址 - n = 地址 - n * 类型所占的字节数 2)、只能跟整数运算,不能跟浮点数运算 */
//例如:
//int类型的指针+1,结果等于原地址+4个字节
//0x7fff5fbff7cc - 0x7fff5fbff7d0
/*
int num = 10;
int *pNum = #//变量名是pNum 类型是int *
printf("%p\n",pNum);//0x7fff5fbff7cc
printf("%p\n",pNum+1); //0x7fff5fbff7d0
*/ //char类型的指针+1,结果等于原地址+1个字节
//0x7fff5fbff7cf - 0x7fff5fbff7d0
/*
char ch = 'a';
char *pCh = &ch;
printf("%p\n",pCh);//0x7fff5fbff7cf
printf("%p\n",pCh + 1);//0x7fff5fbff7d0
*/ //float类型的指针+1,结果等于原地址+4个字节
//0x7fff5fbff7cc - 0x7fff5fbff7d0
/*
float f = 10.3f;
float *p = &f;
printf("%p\n",p); //0x7fff5fbff7cc
printf("%p\n",p+1);//0x7fff5fbff7d0
*/ //double类型的指针+1,结果等于原地址+8个字节
//0x7fff5fbff7c8 - 0x7fff5fbff7d0
/*
double d = 10.3;
double *p = &d;
printf("%p\n",p); //0x7fff5fbff7c8 printf("%p\n",p+1);//0x7fff5fbff7d0
*/ //long类型的指针+1,结果等于原地址+8个字节
//0x7fff5fbff7c8 - 0x7fff5fbff7d0
/*
long num = 10l;
long *p = #
printf("%p\n",p);//0x7fff5fbff7c8
printf("%p\n",p+1);//0x7fff5fbff7d0
*/ //指针只能跟整数运算,不能跟浮点数运算
/*
int num = 10;
int *p = #
printf("%p\n",p+1.0); //报错
*/
二、指针加减法的作用
/*
指针跟整数的加法和减法都可以用来遍历数组
加法:
int nums[3] = {10,20,30};
int *p = &nums[0];
for (int i = 0; i<3; i++) {
printf("%d\n",*(p+i));
} 减法:
int nums[3] = {10,20,30};
int *p = &nums[2];
for (int i = 0; i<3; i++) {
printf("%d\n",*(p-i));
}
*/
三、指针和指针的运算
/*
指针可以和指针进行运算,但是只能进行减法运算。
指针和指针的减法运算,结果是一个long类型。
a.指针跟指针之间只能做减法运算,加、乘、除、取余都不可以。
b.指针跟指针之间的运算结果是一个整数,而且是long类型的。
c.指针跟指针之间的运算,必须是相同类型的指针,否则报错。 作用:指针的减法运算,只要是为了计算两个地址之间,相差了几个位(几个相同类型的空间) 公式:
地址 - 地址 = (地址 - 地址)/ 类型所占字节数
*/
//例如:
int num1=,num2=,*p1 = &num1,*p2 = &num2;
printf("%ld\n",p1-p2);//
四:指针运算的注意事项
/*
注意:
指针和整数,不能相数
指针和整数,不能相除
指针和整数,不能取余
加法和减法都不能和浮点数进行运算。 */
五、指针函数的介绍
/*
指针函数:
其实应该在中间加一个的字。叫 指针的函数,本质上还是一个函数。 当函数的返回值是一个指针的时候,就叫指针函数。 定义语法:
类型 * 函数名(参数列表){ 函数体;
} 注意:这个*可以放在类型和函数名中间的任意位置。 内存中有一个地方叫栈区,栈区里面放的是局部变量。 有一个特点:出了作用域,就会回收。 注意:用指针函数的话,目前没什么用,C语言中的数据类型只要是局部的都是存在栈里面的。 用处的话:只能返回全局变量或者返回字符串常量,还可以返回静态变量的地址。 */
#include <stdio.h> int qNum = ; int *test(){ //函数名是test 返回值是int * // int num = 1; // int *p = # // return # return &qNum;
} char *test2(){ char *str = "qwe"; return str;
} int main(int argc, const char * argv[]) { /*
int *p = test(); int nums[100] = {0}; printf("%d\n",*p);
*/ char *str = test2(); printf("%s\n",str); return ;
}
函数的指针将在下一篇介绍。
c语言学习之基础知识点介绍(十四):指针的进阶的更多相关文章
- c语言学习之基础知识点介绍(四):算术运算符和逗号表达式
本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介 ...
- oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍
一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类 ...
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- c语言学习之基础知识点介绍(二):格式化控制符和变量的补充
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...
- c语言学习之基础知识点介绍(十):数组
本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...
- c语言学习之基础知识点介绍(二十):预处理指令
一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: ...
- c语言学习之基础知识点介绍(十五):函数的指针
一.函数的指针的介绍 /* 函数指针: 函数的指针,本质上一个指针 指向函数的指针,就是一个函数指针. 回忆:我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令 先存在内存里面,然后CPU读 ...
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
- c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量
一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址 ...
随机推荐
- POJ 1773 Parity game 带权并查集
分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...
- Datatable转换成List实体对象列表 几个实例
一, /// <summary> /// 将Datatable转换为List集合 /// </summary> /// <typeparam name="T&q ...
- selenium WebDriver 获取disabled文本框内容(转)
有这样一个元素:<input name="name" id="id" type="text" disabled="true& ...
- hive的安装步骤
在node2里安装一下hive1.2.1,步骤如下: 1.解压hive的安装包 2.改变目录:mv apache-hive-1.2.1-bin /home/install/hive-1.2 3.vi ...
- Specular light 计算
Specular lighting is most commonly used to give light reflection off of metallic surfaces such as mi ...
- 调试 Azure 云服务项目的方法
调试 Azure 云服务项目 在菜单栏中选择“调试”>“启动调试”(键盘操作:F5). 重要提示 如果未将 Azure 云服务项目设置为启动项目,当你单击按钮以触发断点时,将出现以下错误:“外部 ...
- Java中String是“引用”传递
如题,在java中这是一个典型的问题. 在stackoverflow上已经有很多相似的问题被提问,并且有很多不正确或不完整的答案.如果你不往深处想,这是一个很简单的问题.但如果深入思考,它却很让人迷惑 ...
- 【Java基础】Java内部类
什么是内部类 把类定义在其他类的内部,这个类就被称为内部类. 内部类的分类 内部类分为两种,分别为成员内部类和局部内部类: 成员内部类:和成员变量和成员方法定义在同级 局部内部类:和局部变量定义在同级 ...
- json.net json转换神器
json.nethttps://json.codeplex.com/ api documenthttp://james.newtonking.com/json/help/index.html#
- ASP.NET- Repeater 嵌套
我们有时候需要查找出父菜单下面全部的子菜单,然后根据子菜单的ID查找出该类别下面的全部新闻. 通常往往只知道父级菜单的ID,但不知道父级菜单下面有多少个子菜单,也不知道子菜单的ID 所以我们往往需要根 ...