一、指针的加、减法运算

/*
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 = &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语言学习之基础知识点介绍(十四):指针的进阶的更多相关文章

  1. c语言学习之基础知识点介绍(四):算术运算符和逗号表达式

    本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介 ...

  2. oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍

    一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类 ...

  3. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

  4. c语言学习之基础知识点介绍(二):格式化控制符和变量的补充

    上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...

  5. c语言学习之基础知识点介绍(十):数组

    本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...

  6. c语言学习之基础知识点介绍(二十):预处理指令

    一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: ...

  7. c语言学习之基础知识点介绍(十五):函数的指针

    一.函数的指针的介绍 /* 函数指针: 函数的指针,本质上一个指针 指向函数的指针,就是一个函数指针. 回忆:我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令 先存在内存里面,然后CPU读 ...

  8. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...

  9. c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量

    一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址 ...

随机推荐

  1. 使用PowerDesigner建立数据库模型

    转自:http://www.cnblogs.com/tonyepaper/archive/2008/02/12/1067260.html 1.       打开PowerDesigner,点击File ...

  2. Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法

    一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...

  3. spring--DI--3

    3.1.1  依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现:表示类对接口的实现 ...

  4. 安装Python及工具

    在Windows上安装Python 第一步:下载安装包 根据Windows版本(64或32)从Python官方网站下载对应的Python版本,此次使用python V3.5. 下载路径:https:/ ...

  5. java md5方法 for Android

    很简单的方法 public static String md5(String string) { byte[] hash; try { hash = MessageDigest.getInstance ...

  6. vijosP1115 火星人

    vijosP1115 火星人 链接:https://vijos.org/p/1115 [思路] 排列组合. 题目要求为求第下m个排列. 这里有两种方法,首选的是调用algorithm中的next_pe ...

  7. linux shell 中"2>&1"含义

    脚本是:      nohup /mnt/Nand3/H2000G  >/dev/null  2>&1  &      对于& 1 更准确的说应该是文件描述符 1, ...

  8. POJ-3017 Cut the Sequence DP+单调队列+堆

    题目链接:http://poj.org/problem?id=3017 这题的DP方程是容易想到的,f[i]=Min{ f[j]+Max(num[j+1],num[j+2],......,num[i] ...

  9. 每个android项目都应该使用的android 库

    http://blog.teamtreehouse.com/android-libraries-use-every-project A good developer knows to never re ...

  10. 关于学习Scala语言的一些感悟

    进入话题! 我们知道哈,Spark源码采用Scala语言编写,那么阅读Spark源码之前,是否一定先学Scala呢? 我个人认为,不必,只要我们有一些java或c++编写语言的基础,就可以看Spaar ...