当前位置: 首页 > news >正文

C语言—再学习(指针)

一、指针是什么?                                                                               

指针是一种在计算机编程中用于存储和操作内存地址的变量。

指针变量中存储的是内存地址,而不是数据本身。通过指针,程序可以直接访问和操作内存中的特定位置,这使得程序员能够更灵活地管理内存,实现对数据的高效访问和修改。

它可以用于在函数之间传递数据、动态分配内存、实现数据结构(如链表、树等)以及优化程序的性能。

注:整型变量分配4个字节、单精度浮点型变量分配4个字节字符型变量分配1个字节

注:数据的分配是分类型的,对不同类型的数据,在内存中分配的存储单元大小,和存储方式是不同的。为了有效存取数据需要位置信息之外,还需要有改数据的类型信息。

例:若有int类型的变量a,和float类型变量b。若先后把它们分配在2000开始的存储单元中,&a和&b的信息完全相同吗?  答案是不相同的,虽然编号相同,但是数据类型不同

二、指针的存取                                                                                   

printf ("%d", &i) ;

在此之前系统已经为 i 分配了按整型存储方式的4个字节。并建立了对应的变量名和地址的对应表。在执行上面语句时——首先通过变量名找到对应的地址,从该4个字节中按照整型数据的存储方式读出整型变量 i 的值,然后按十进制整数格式输出。

scanf("%d",&i);

执行时,把键盘输入的值送到地址为2000开始的整型存储单元中。

这种直接按变量名进行的访问,称为:直接访问

当然也可以:间接访问

i_pointer = &i;  //将 i 的地址存放在i_pointer中,i_pointer的值就是2000 

在此处i_pointer就是    指针变量     ,指针变量的值是地址

三、定义指针变量

一般形式:类型名  * 指针变量名

例如:int *pointer_1, *pointer_2;

int是定义指针变量必须指定“基类型”

注意⚠️:指针变量中只能存放地址,不能存放整数

*pointer_1=100;   //不合法!

四、引用指针变量

(1)给指针变量赋值

p=&a;    //把a的地址赋值给指针变量p

(2)引用指针变量指向的变量

在(1)的基础上:

printf("%d", *p);  //其作用是以整数形式输出指针变量p所指向的变量的值,即a的值

这里*p代表的是一个整数值

*p = 1; //表示将整数1赋给p当前所指的变量,也就是a=1

 (3)引用指针变量的值

printf("%o",p);    //表示输出指针变量p的值,如果p指向a,那就是输出a的地址值,即&a。

1⚠️:     &  取地址运算符,&a是变量a的地址。

2⚠️:     *   指针运算符。*p代表指针变量p指向的对象。

例题:输入两个整数a、b。按大小输出a、b

五、指针变量作为函数参数

还是做两个数交换,例题:

 swap函数表示,传入两个指针变量,进行交换,其中中间值是一个整形变量!所以说交换的是两个地址里面的值

在main函数里定义两个int型指针变量,并且分别指向a、b。如果符合条件就交换两个地址里面的值。此时a、b里面的值已经被换了。

⚠️:swap函数里面的中间变量是指针可以吗?

⚠️:swap函数如果不是用指针来传参,用形参x、y可以吗?

六、通过指针引用数组

所谓数组元素的指针就是数组元素的地址

int a[10] = {1,3,5,7,9,11,13,15,17,19};//定义a为包含10个整型数据的数组
int *p;                                //定义p为指向整型变量的指针变量
p = &a[0];                             //把a[0]元素的地址赋给指针变量p

第三行的p代表是一个地址值!  

  • 数组名代表数组中首元素的地址,因此下面两个语句等价
p = &a[0];  //p的值是a[0]的地址
p = a;      //p的值是数组a首元素(即a[0])的地址
  • 引用一个数组元素,可以使用下面两种方法:

               <下标法,如a[i]  形式。

               <指针法,如 * (a+i)或 *(p+i)

  • 在使用数组元素时指针的运算:

   <指针可以进行加减运算,其结果会根据指针类型自动调整。

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;  // 指向数组首元素ptr + 2;  // 指向arr[2](偏移2*sizeof(int)字节)
ptr - 1;  // 指向arr[-1](需确保地址有效)

<通过修改指针值可以遍历数组:

for (int i = 0; i < 5; i++) {printf("%d ", *ptr);  // 输出当前元素ptr++;  // 指向下一个元素
}

<两个同类型指针相减得到元素个数的差值:

int *p1 = &arr[0];
int *p2 = &arr[3];
printf("%d", p2 - p1);  // 输出:3

分析:*(p++)与*(++p)的作用

*(p++):先取*p的值,然后使p加1。 相当于a[i++]

*(++p) :先使p加1 ,再取*p    ,相当于a[++i]                 

http://www.xdnf.cn/news/451837.html

相关文章:

  • C++(2)
  • 中国古代史7
  • 230. 二叉搜索树中第 K 小的元素
  • day25 python异常处理
  • c#中equal方法与gethashcode方法之间有何关联?
  • 2025五一杭州西湖三天游
  • 大涡模拟实战:从区域尺度到街区尺度的大气环境模拟
  • 【python】UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xb2
  • 一种资源有限单片机处理cJSON数据的方法
  • 编写第一个MCP Client之Hello world
  • Android RTL语言视图适配(保加利亚,阿拉伯语种等)
  • JAVA中的文件操作
  • sqli—labs第六关——双引号报错注入
  • BitMart合约交易体验 BitMart滑点全赔的底层逻辑
  • 朱老师,3518系列,第八季
  • 使用Git+Cron实现BIND的Named域名配置自动化管理!
  • D2203使用手册—高压、小电流LDO产品4.6V~36V、150mA
  • AD 异性铺铜
  • 破解商业综合体清洁管理困局:商业空间AI智能保洁管理系统全场景解决方案
  • CodeBuddy 接入 MCP,一键生成网站!
  • 从规则驱动到深度学习:自然语言生成的进化之路
  • SpringbBoot nginx代理获取用户真实IP
  • 3337|3335. 字符串转换后的长度 I(||)
  • leetcode2934. 最大化数组末位元素的最少操作次数-medium
  • 练习小项目:倒数日小工具
  • Windows软件插件-写wav
  • 【Embedding Models】嵌入模型选择指南
  • 蓝卓入选2025宁波最具潜力新品牌TOP10
  • 数据库字段唯一性修复指南:从设计缺陷到规范实现
  • 安装windows版本的nacos