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

C语言基础之指针2

指针的计算

指针中数据类型的作用:获取指针移动一次的字节个数,也就是一个步长的大小。

#include<stdio.h>
int main()
{int a = 10;int* p = &a;printf("p的值为:%p\n", p); //p的值为:000000D9C330F994p = p + 1;printf("p的值为:%p\n", p);//p的值为:000000D9C330F998return 0;
}
对应数据类型的步长(在Windows64位操作系统上)
char  :1
short  :2
int  :4
long  :4
long long  :8

例如上面的代码,p存储变量a的地址,p向后移动一次,字节数向后加4,是指针数据类型对应的字节个数。同时,在进行减运算时代码雷同。在对指针进行乘除运算是无意义的,因为这时指针的指向不明。

通过获取地址进行运算得到数组中的数据

#include<stdio.h>
int main() {int arr[] = { 52,8,96,3,5,2,3,6 };//获取0索引的地址int* p = &arr;printf("%d\n", *p);//52printf("%d\n", *(p + 1));//8return 0;
}

计算数组中两个地址之间的间隔

#include<stdio.h>
int main() {int arr[] = { 52,8,96,3,5,2,3,6 };//获取0索引的地址int* p = &arr;printf("%d\n", *p);//52printf("%d\n", *(p + 1));//8//获取5索引的内存地址int* p2 = &arr[5];printf("p和p2间隔了多少个步长:%d\n", p2 - p);//5return 0;
}

指向不明的指针

野指针:指针指向的空间未分配

#include<stdio.h>
int main() {int a = 10;int* p1 = &a;printf("%p\n", p1);//000000041BFBF7D4printf("%d\n", *p1);//10//p2是野指针int* p2 = p1 + 10;printf("%p\n", p2);printf("%d\n", *p2);//结果随机return 0;
}

悬空指针:指针指向的空间已分配,但是被释放了

int* method();
int main() {int* p3 = method();printf("拖点时间\n");//拖点时间printf("%p\n", p3);//0000007A620FFA24printf("%d\n", *p3);//17错误return 0;
}
//函数写在main函数之后要在main函数之前进行声明
int* method() {int num = 10;int* p = &num;return p;
}

没有类型的指针

特殊类型:

void   *   p    不表示任何类型

特点:无法获取数据,无法计算,但是可以接收任意地址

函数:用来交换两个变量记录的数据
void swap(int* p1, int* p2) {int temp = *p1;*p1 = *p2;*p2 = temp;
}
修改一下函数,更具有通用性
void swap(void* p1, void* p2, int len) {//把void类型的指针,转成char类型的指针char* pc1 =  p1;char* pc2 =  p2;char temp = 0;//以字节为单位,一个字节一个字节的进行交换for (int i = 0; i < len; i++) {temp = *pc1;*pc1 = *pc2;*pc2 = temp;pc1++;pc2++;}}
int main() {int a = 100;int b = 300;//调研汉书交换数据swap(&a, &b, 4);printf("交换后:%d   %d\n", a, b);return 0;
}
int main() {//void类型的指针//定义两个变量int a = 10;short b = 20;//定义两个指针int* p1 = &a;short* p2 = &b;//打印输出printf("%d\n", *p1);//10printf("%d\n", *p2);//20//不同类型的指针之间是不能相互赋值的//但是void没有任何类型,可以接收任意类型指针记录的内存地址//void* p3 = p1;//void* p4 = p2;//缺点:void类型的指针,无法获取里面的数据,也不能进行加,减运算//printf("%d\n",p3+1);这是错误写法return 0;
}

http://www.dtcms.com/a/426768.html

相关文章:

  • 淘客网站怎么做 知乎wordpress淘宝联盟插件
  • flink工作流程
  • openHarmony之storage_daemon:分区挂载与设备节点管理机制讲解
  • 建站怎么赚钱个人官方网站怎么建设
  • 学习笔记093——Windows系统如何定时备份远程服务器的mysql文件到本地?
  • 操作系统内核架构深度解析:从单内核、微内核到鸿蒙分布式设计
  • MySQL 架构全景解析
  • .NET MVC中实现后台商品列表功能
  • oracle logwr,ckpt,dbwn 如何协同工作的
  • C# 网络通讯核心知识点笔记
  • Ubuntu之apt安装ClickHouse数据库
  • 在线音乐网站开发现状网站全屏弹出窗口
  • 泛型在Java集合框架中的应用有哪些?
  • 服务器中使用Docker部署前端项目
  • mysql之二进制日志
  • 【完整源码+数据集+部署教程】染色体图像分割系统: yolov8-seg-KernelWarehouse
  • Docker MySQL 使用全流程
  • Visual Studio主题、字体、快捷键、开发环境设置,自用
  • 火山 19 混音伴音 接口
  • Bean精细化控制属性序列化反序列化
  • 前端权限模型——RBAC
  • 杭州知名网站建设公司电商网站建设好么
  • 不忘初心网站建设做网站的工具
  • VSCode实现字符串粘贴转义复制反转义
  • 第2章 三个小工具的编写(2)
  • 【DeepResearch】langgraph自主迭代研究能力的 AI 代理及分析
  • 专题:2025医药行业数智赋能与AI应用全景研究报告|附200+份报告PDF、数据仪表盘汇总下载
  • Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)-问题篇
  • LeetCode 刷题【93. 复原 IP 地址】
  • Python类和对象----实例属性,类属性(这是我理解类和对象最透彻的一次!!)