c语言学习之基础知识点介绍(十四):指针的进阶

时间:2023-01-02 22:17:35

一、指针的加、减法运算

/*
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. ACM集训的第一题

    对于一群NP(2<=NP<=10)个要互送礼物的朋友,郭铮鹏要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人 ...

  2. EXE中释放文件

    今天有个朋友问到VC能否释放多个EXE.DLL或WAV等文件,我便做了个实例给他. (注意:以下释放资源代码是不受文件扩展名所限制的,你可以释放更多类型文件) 下面是我写了个很方面的函数给大家用! 1 ...

  3. session跨域共享解决方案

    要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...

  4. 本地yum源

    <pre name="code" class="html">1.为DVD创建一个挂载目录 [root@localhost ~]# mkdir /me ...

  5. Yarn应用程序运行流程剖析

    Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以 ...

  6. UESTC&lowbar;Tournament CDOJ 124

    A sports company is planning to advertise in a tournament. It is a single round-robin tournament, th ...

  7. Redis系列之(一):10分钟玩转Redis(转)

    1. Redis介绍 Redis是一个开源的使用ANSI C语言编写.基于内存的Key-Value数据库. 它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集 ...

  8. python3 练手实例3 摄氏温度与华氏温度转换

    def wd(): w=input('请输入一个摄氏温度或者一个华氏温度,如,34c/C or 34f/F:') if w[-1] in ['c','C']: w=float(w[:-1]) hs=1 ...

  9. The Non-Inverting Amplifier Output Resistance by Adrian S&period; Nastase &lbrack;转载&rsqb;

    Source Address: http://masteringelectronicsdesign.com/the-non-inverting-amplifier-output-resistance/ ...

  10. java&period;lang&period;IllegalArgumentException&colon; Attribute &&num;39&semi;items&&num;39&semi; is required and must be a Collection&comma; an Array or a Map

    很有可能是涉及items的时候写成了item导致此错