C语言学习笔记:指针

news2024/11/22 23:31:35

✨博文作者:烟雨孤舟
💖 喜欢的可以 点赞 收藏 关注哦~~

✍️ 作者简介: 一个热爱大数据的学习者

✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教!

目录

简介

指针变量的定义

指针变量初始化

指针变量的引用

指针的基本运算

指针的算术运算

指针和函数

指针和数组

指针和字符串


简介

每一个变量都有一个内存位置。指针就是变量的内存地址,指针变量是用来存放内存地址的变量,就像其他变量一样,在使用指针存储其他变量地址之前,要对其进行声明。指针变量的值是个地址,这个地址不仅可以是变量的地址也可以是其他数据结构的地址(数组、函数等)。为了表示指针变量和它所指向的变量之间的关系,在程序使用 *表示指向

指针变量的定义

变量或程序代码在程序运行时会被以字节为单元存储在存储器中,程序会根据变量类型分配相应大小的内存单元,内存单元分为内存内容与内存地址,内存内容一般为变量的实际值,内存地址就是程序分配给变量的地址指针就是用于访问和操作地址的。
指针的大小取决于计算机体系结构和操作系统的位数。在32位操作系统中,指针通常为4字节;在64位操作系统中,指针通常为8字节。

指针就是内存地址,指针变量是用来存放内存地址的。
指针变量声明的一般形式为:
    type *var_name;
    类型标识符 *变量名;
    int a=3;
    int *ip;    /* 声明一个整型的指针 */
    ip =&a;   //将a的地址赋值给ip;*ip的值就是a的值
定义指针和使用指针是*的意义不同,int *a=&b;表示为指针变量a指向b的地址,即a=&b而不是*a=&b,*a为b的值。在指针变量定义或初始化时变量名之前的*只表示该该变量是一个指针变量,引用指针变量是*则表示间接访问。
指针变量的定义:
    指针变量的类型决定了它所能指向的变量的类型
    指针变量并不固定指向一个变量,可指向同类型的不同变量。
    指针变量定义后,变量值不能确定,应用前必须先赋值。
    指针变量只能存放地址,不能将一个非地址类型的数据(如常量值)赋给一个指针变量,但0(NULL)除外
两个指针运算符:& *
    &:取变量的地址
    *:取指针所指向的内容

 

 

指针变量初始化

一般形式:
	数据类型 *指针名 =初始地址值;
例如:
	int i; 
	int*p=&i;
	//指针变量只能指向定义时所规定的变量
	int i, *p=&i;
	//指针变量和指向定义时所规定类型的变量同时定义
	int i, *p=&i;
	int *q=p;
	//用已初始化的指针变量作为初始值

指针变量的引用

定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。指针的类型必须与它所指变量的类型相同。

两个有关的运算符:
    &:取地址运算符。
    *:指针运算符或称“间接访问”运算符,访问指针变量所指向的对象。
需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的变量。

#include <stdio.h>
int main ()
{
   int  a = 20,int  *p;        /* 指针变量的声明 */
   p = &a;       /*将var的地址赋值给指针ip*/
   printf("a 变量的地址: %p\n", &var  );
   /* 在指针变量中存储的地址 */
   printf("ip 变量存储的地址: %p\n", p );
   printf("*p 变量的值: %d\n", *p );/* 使用指针间接访问值 */
   printf("a 变量的值: %d\n", a );/* 直接访问值 */
   return 0;
}

//a 变量的地址: 0x7ffeeef168d8
//p 变量存储的地址: 0x7ffeeef168d8
//*p 变量的值: 20
//a 变量的值:20

指针的基本运算

1.取地址运算和间接访问运算
int *p,a=3;
p = &a;
//将整型变量a的地址赋值给整型指针p,p的值就是a的地址,*p的值就是a的值
2.赋值运算符
int a=3,*p1,*p2;
p1=&a;
p2=p1;
//a的地址赋值给p1,p1的值为a的地址,把p1的值赋值给p2,p2的值为a的地址,*p1和*p2的值为a的值3.
赋值运算:
    int a=3; int *p=&a;
    //把变量的地址赋予指向的相同数据类型的指针变量
    int a=3;int *p; p=&a;
    //把变量a的值赋予给相同类型的指针变量
    int a=3,*p=&a,*q; q=p; 
    //将指针变量p的值赋值给q,p=a=q=3
    int a[5],*p=a;
    //将数组的首地址赋予指针变量 
    char *p="hellp";

    //把字符串的首地址赋予给指定字符类型的指针变量 

指针的算术运算

C语言支持3种格式的指针算术运算,包括指针加上整数,指针减去整数和两个指针相减。
加减运算:
    对于指向数组的指针变量,可以加上或减去一个数n,即将指针指向的位置前移或者后移n个单位
    int a[5],*p;
    p=a; //指向a0,数组名就是数组首个元素的地址
    p=p+1//指向a1
指针相减:
    两个指针相减,得到的是指针之间元素的个数。若指针p指向a[i],指针q指向a[j],则p-q等于i-j

 C 指针是一个用数值表示的地址。可以对指针进行四种算术运算:++、--、+、-。

设ptr是一个指向地址 1000 的整型指针,ptr++执行完运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 字节
指针的每一次递增,它其实会指向下一个元素的存储单元。
指针的每一次递减,它都会指向前一个元素的存储单元
指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。

*p++或*(p++)    首先计算表达式的值为*p,然后p自增1
(*p)++    首先计算表达式的值为*p,然后*p自增1
*++p或*(++p)    首先将p自增1,然后计算表达式的值为*p
++*p或++(*p)    首先将(*p)自增1,然后计算表达式的值为(*p)

指针和函数

在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。凡是出现数组、函数的地方都可以用一个指针变量来表示,只要在该指针变量中赋予数组或函数的首地址即可。

在c语言中指针也可以作为函数的参数,如果某个变量的地址作为函数的实参,相应的形参就是指针。
函数实参与形参之间的数据传递是单向的“值传递”方式,调用函数不能改变实参的值,指针变量作为函数参数时也遵守这一个规则。
调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值,这样的机制被称为引用调用。采用引用调用需要在函数定义时将指针作为函数的形参,在函数调用时把变量的地址作为实参。

指针和数组

如果定义了一个一维数组,系统会默认为数组分配一段连续的内存空间,此时定义一个指针,并把数组的第一个元素的起始地址赋值给该指针,则该指针就指向了这个数组。
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。
指针:也是一个变量,存储的数据是地址。
数组名:代表的是该数组最开始的一个元素的地址。
指针数组:int *ptr[MAX];
把ptr声明为一个指针数组,由多个整数指针组成。ptr中的每个元素,都是一个指向 int 值的指针。
例如:
int a[2]={1,2};
int *p =a[0];
//将数组元素a[0]的地址赋值给指针p,使p指向数组a的第一个元素

在使用指针数组存放多个相同数据类型的数据并进行运算时数组的长度在定义时必须给定,如果事先不知道数据的数量只能采用估计上限和利用指针实现存储空间的动态分配。

指针引用一维数组元素,可以用以下两种方法:
1.下标法:如a[i]或p[i]形式
2.指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初始值为p=a,即p的值为数组名(数组首元素的地址)。

指针与数组的区别:
1. 指针和数组保存的数据内容不同.指针保存指针变量,即保存数据的地址;数组保存同一类型数据的值
2. 指针用于动态数据结构,指针保存的数据可以改变;数组用于存储固定数目且数据类型相同的元素,数组的大小定了就不容易变了;
3. 指针用malloc()和free()来分配空间和释放空间,而数组是隐式分配和删除
4. 指针通常指向匿名数据,而数组自身就是数组名
5.作为函数参数时数组名就等于指针 

指针和字符串

在C语言中,可以用两种方法访问一个字符串:
    用字符数组存放一个字符串,然后输出该字符串。
    char string[]="IloveChina!";
    printf("%s\n",string);
    用字符串指针指向一个字符串。
    char*string="IloveChina!";
    printf("%s\n",string);

字符串的指针表示法:
    char *指针名;

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis客户端 - SpringDataRedis

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - SpringDataRedis | CoderMast编程桅杆https://www.codermast.com/database/redis/spring-data-redis.html 介绍 SpringData 是 Spring 中操作数据的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中…

2023 年最新阿里巴巴 Java 面试权威指南(泰山版)

不知道现在同学们有没有想法备战金九银十&#xff0c;好多未雨绸缪的同学已经开始整理学习资源了&#xff0c;有些同学想冲击一下大厂&#xff0c;有些同学希望自己能够涨薪&#xff01;不管是出于哪种想法&#xff0c;看一下现在的时间&#xff0c;也确实该准备了&#xff0c;…

English Learning - L3 作业打卡 Lesson6 Day41 2023.6.14 周三

English Learning - L3 作业打卡 Lesson6 Day41 2023.6.14 周三 引言&#x1f349;句1: In the early morning, the food that had been laid out for the dead is thrown into a river or into the sea as it is considered unlucky for anyone living to eat it.成分划分弱读…

C语言学习笔记:数组

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录​​​​…

基于javaweb jsp+SSM 酒店客房管理系统的设计与实现

一.项目介绍 本系统需要进行登录&#xff0c;点击登录即可跳转到登陆页面&#xff0c; 管理员密码是在数据库中设置好的可以直接登录&#xff0c; 其它用户需要管理员登录以后注册用户才可以根据账号密码登录。 当登录进入到系统当中时 可以对客房&#xff0c;商品&#xff…

使用python制作一个批量查询搜索排名的SEO免费工具

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 搭建背景 最近工作中需要用…

《人月神话》译文修订明细(10)-读者可以对照修改

《人月神话》译文修订明细&#xff08;1&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;2&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;3&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;4&#xff09;-读…

团队管理之性能实施团队日志14 -- 项目终结

历时2个月16天&#xff0c;项目结束了。 今天给客户做最终的汇报。 本来汇报准备了92页PPT&#xff0c;把几个系统单独的都一个个说了个遍。但是感觉这种方式老板不一定能接受。于是换了一个方式&#xff0c;只说overview的结果&#xff0c;但系统的就不一一解释了。 老板更想…

【C/C++套接字编程】TCP通信实验

一、实验目的&#xff1a; 通过本实验使学员了解和掌握编写基于TCP协议的网络应用程序。任务是开发一个基于TCP Socket API的网络聊天程序。 二、实验内容简要描述 用所学的TCP Socket API知识来开发基于TCP协议的网络。通过编程实现服务端和客户端的信息通信。TCP协议建立交…

【MySQL】之索引与索引优化

目录 一、索引介绍二、MySQL索引结构二、索引优化 一、索引介绍 1、索引简介 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 可以得到索引的本质&#xff1a;索引是数据结构。索引的目的在于提高查询效率&…

高考状元、通用语言和轰趴-UMLChina建模知识竞赛第4赛季第4轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响获奖&#xff0c…

Springboot使用pdfbox提取PDF图片

Springboot使用pdfbox提取PDF图片 PDFBox的介绍Springboot集成PDFBox一、提取pdf首页为图像1. 实现需求2. 项目代码3. 执行结果 二、将pdf内容全部转换为图像1. 实现需求2. 项目代码3. 执行结果4.注意事项1.优化项目代码2.提升Java heap size PDFBox的介绍 PDFBox是一个用于创…

FDM3D打印系列——1、愉快的给自己打印一个手办

大家好&#xff0c;我是阿赵。 我日常的个人爱好&#xff0c;除了写博客&#xff0c;还有弹吉他打鼓电子琴&#xff0c;还有3D打印。 3D打印只是我的一个业余&#xff0c;不过由于经常把做好的作品发朋友圈&#xff0c;也带动了身边一些朋友买了和我一样型号的打印机&#xff0…

一种说法:哲学是研究真善美的

一种说法&#xff1a;哲学是研究真、善、美的 今天在工作中谈到了真善美 确定一个企业价值观&#xff1a;求真&#xff0c;求善&#xff0c;求美 我觉得挺好&#xff0c;起码无需解释能懂意思 趣讲大白话&#xff1a;真善美是基本问题 【趣讲信息科技199期】 *****************…

用Python做一个下载器,从获取数据到编写GUI界面

本片文章目录 前言案例基本实现思路?代码实现一、单张小说下载二、整本小说下载三、多线程采集四、采集排行榜所有小说五、搜索小说功能六、GUI界面 尾语 前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 对于广大书虫而言&#xff0c;没有小说看是最痛苦的&#xff0…

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四 引言&#x1f349;句1: In towns that are near the sea, the tiny lanterns which had been hung in the streets the night before, are placed into the water when the festival is over.成分划分弱读连读爆破…

(二叉树) 129. 求根节点到叶节点数字之和 ——【Leetcode每日一题】

❓129. 求根节点到叶节点数字之和 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数…

CSS- 横向和纵向时间轴

/*横向时间轴*/.time-horizontal {list-style-type: none;border-top: 1px solid #707070;max-width: 800px;padding: 0px;margin: 0px;}.text-horizontal {list-style-type: none;max-width: 800px;padding: 0px;margin: 0px;}.text-horizontal li {float: left;position: rel…

数据中心网络的电路交换域

buffer 的意义在用带宽平滑统计突发&#xff1a; 流量波动越大&#xff0c;统计复用能效越高。假设没有 buffer&#xff0c;将大量溢出和空载并存。但如果流量是可预期的&#xff0c;也可以转向相反的方向&#xff0c;比如虚电路。 数据中心与 Internet 不同&#xff0c;流量…

90后Android程序员杨国民的羊粪肥创业故事:从社恐到销售奇迹

90后Android程序员杨国民的羊粪肥创业故事&#xff1a;从社恐到销售奇迹 最近一位90后程序员杨国民的创业故事在社交媒体上引起了轰动。他回到了内蒙古老家&#xff0c;并以羊粪肥为主要产品&#xff0c;取得了惊人的销售成绩。据报道&#xff0c;他的羊粪肥月销量达到了120万…