c语言四十个知识点,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

int qNum = ;

int *test(){ //函数名是test 返回值是int *

// int num = 1;

// int *p = &num;

// return &num;

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语言中运算符. 运算符主要分为四类: 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个地址 ...

随机推荐

&lbrack;No000036&rsqb;操作系统Operating Systems系统调用的实现System&lowbar;Call

实现一个whoami 系统调用 系统调用的直观实现 问题+直观想法… 用户程序调用whoami, 一个字符串"systemcall "放在操作系统中(系统引导时载入) ,取出来打印 ...

构造函数创建对象和Object&period;create()实现继承

第一个方法用构造函数创建对象,实现方法的继承 /*创建一个对象把所有公用的属性和方法,放进去*/ function Person() { this.name = "W3cplus" ...

QML入门教程

QML是Qt推出的Qt Quick技术的一部分,是一种新增的简便易学的语言.QML是一种陈述性语言,用来描述一个程序的用户界面:无论是什么样子,以及它如何表现.在QML,一个用户界面被指定为具有属性的 ...

Javascript 笔记与总结(1-5)闭包

[例1]

python 打包与部署

环境:win10.eclipse-jee-mars.python2.7 打包在linux上进行安装测试 1.1 打包 项目目录结构如下: 打包对象:utils.reg 在P1项目的顶级目录,也就是ut ...

Eclipse下运行Maven项目提示缺少maven-resources-plugin&colon;2&period;4&period;3

将一个手动创建的Maven项目(命令行下可正常运行)导入到Eclipse中,运行时提示这样的错误信息:[ERROR] Plugin org.apache.maven.plugins:maven-res ...

Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include ...

406&period; Queue Reconstruction by Height

一开始backtrack,设计了很多剪枝情况,还是TLE了 ..后来用PQ做的. 其实上面DFS做到一半的时候意识到应该用PQ做,但是不确定会不会TLE,就继续了,然后果然TLE了.. PQ的做法和剪 ...

DataGrid导出excel

DAL://产品信息导出——LPH public DataTable ExportRelease(string type) { string sql = "SELECT [ProductID ...

STM8S003&sol;005&sol;007芯片解密单片机解密程序提取复制经验分享!

STM8S003/005/007芯片解密单片机解密程序提取复制 芯片解密型号: STM8S003K3T6,STM8S005K6T6,STM8S007C8T6,STM8S003F3P6 STM8S005 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值