带你速通C语言——位运算符、结构运算符与指针运算符(5)

news2024/12/21 23:45:23

位运算符、结构运算符与指针运算符

C语言的位运算符、结构运算符和指针运算符是对数据的更底层操作,使得C语言尤其适合进行系统编程和处理复杂的内存管理任务。下面详细介绍这些运算符。

1.位运算符

位运算符作用于整数类型的操作数的二进制位。以下是C语言中可用的位运算符:

  • & 位与:对两个位都为1时,结果位才为1。
  • | 位或:对两个位中至少一个为1时,结果位就为1。
  • ^ 位异或:对两个位不同时,结果位为1。
  • ~ 位非:对位取反,即0变1,1变0。
  • << 左移:将位向左移动指定的位数,右侧空出的位用0填充。
  • >> 右移:将位向右移动指定的位数,左侧空出的位的填充方式取决于机器和编译器(通常是符号位填充或0填充)。

2.结构运算符

结构运算符用于访问结构体(或联合体)中的成员。在C语言中有两种结构运算符:

  • . 结构体成员运算符:用于访问结构体变量的成员。
  • -> 结构体指针运算符:用于通过结构体指针访问其成员。

例如,假设有一个结构体 Person 和一个指向该结构体的指针 p

struct Person 
{
    char name[50];
    int age;
};

struct Person person;
struct Person *p = &person;

person.age = 30;       // 使用 . 来访问
p->age = 30;           // 使用 -> 来访问

3.指针运算符

指针运算符与指针直接相关,是C语言中非常核心的部分:

  • * 解引用运算符:访问指针指向的位置。
  • & 地址运算符:获取变量的内存地址。

使用示例:

int val = 20;
int *ptr = &val; // ptr 存储 val 的地址
int val2 = *ptr; // val2 现在也是 20,因为 *ptr 解引用了 ptr

4.运行试一试

让我们通过简单且有注释的例子来解释这些概念

4.1位运算符

位运算符主要用于对整数数据类型的位进行操作。下面是一些常见的位运算符和它们的使用例子:

#include <stdio.h>

int main()
{
    unsigned int a = 12;     // 二进制表示为 1100
    unsigned int b = 10;     // 二进制表示为 1010

    // 位与运算
    unsigned int and = a & b;  // 结果是 1000 (8)
    printf("a & b = %u\n", and);

    // 位或运算
    unsigned int or = a | b;   // 结果是 1110 (14)
    printf("a | b = %u\n", or);

    // 位异或运算
    unsigned int xor = a ^ b;  // 结果是 0110 (6)
    printf("a ^ b = %u\n", xor);

    // 位非运算
    unsigned int not = ~a;     // 结果是 11111111 11111111 11111111 11110011 (取决于数据类型长度)
    printf("~a = %u\n", not);

    // 左移运算
    unsigned int left_shift = a << 2;  // 110000 (48)
    printf("a << 2 = %u\n", left_shift);

    // 右移运算
    unsigned int right_shift = a >> 2; // 0011 (3)
    printf("a >> 2 = %u\n", right_shift);

    return 0;
}
运行结果

4.2结构运算符

结构运算符.->用于访问结构体成员。

#include <stdio.h>

struct Person 
{
    char name[50];
    int age;
};

int main() 
{
    struct Person person;
    struct Person *ptr = &person;

    // 使用点运算符访问结构体成员
    person.age = 30;
    printf("Age: %d\n", person.age);

    // 使用箭头运算符通过指针访问结构体成员
    ptr->age = 31;
    printf("Age: %d\n", ptr->age);

    return 0;
}
运行结果

4.3指针运算符

指针运算符*用于解引用指针(访问指针指向的值),而&用于取得变量的地址。

#include <stdio.h>

int main() 
{
    int val = 20;
    int *ptr = &val; // 使用 & 取地址

    // 打印变量的地址和值
    printf("Address of val: %p\n", (void *)&val);
    printf("Value of val: %d\n", val);

    // 解引用指针
    int val2 = *ptr; // *ptr 是解引用
    printf("Value of val2: %d\n", val2);

    // 改变指针指向的值
    *ptr = 30;
    printf("New value of val: %d\n", val);

    return 0;
}
运行结果

5.小结

这些运算符使得C语言在操作系统开发、嵌入式系统开发和性能优化领域变得非常强大。它们允许程序员直接与内存地址和结构数据交互,提供了高效处理数据的能力。

-------------------end

读者若感兴趣可关注个人微信公众号,将持续为您分享有用的工科知识。

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

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

相关文章

报SBAT self-check failed: Security Policy Violation突然开不了机

台式机一直用的好好的没什么问题&#xff0c;早晨突然开机就关机提示&#xff1a; 查了一下网上资料&#xff0c;在BIOS里面搜“安全启动”改为禁用就行&#xff0c;该电脑微星主板直接由开启改为禁用&#xff0c;重启进入系统。很奇怪&#xff0c;一直用的没啥&#xff0c;突然…

Spring AOP应用指南:概念、通知与表达式分析

目录 一.AOP的基础概念 二.Spring AOP的应用场景 三.Spring AOP的核心概念 ▐ 切点(Pointcut) ▐ 连接点(Join Point) ▐ 通知(Advice) ▐ 切面(Aspect) 通知类型 四.PointCut与Order 切面优先级 五.切点表达式 execution(...)表达式 annotation表达式 一.AOP的基…

Java spring SSM框架--mybatis

一、介绍 Spring 框架是一个资源整合的框架&#xff0c;可以整合一切可以整合的资源&#xff08;Spring 自身和第三方&#xff09;&#xff0c;是一个庞大的生态&#xff0c;包含很多子框架&#xff1a;Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…

NLP实战二:Pytorch实现TextRNN文本分类

中文数据集 我从THUCNews中抽取了20万条新闻标题&#xff0c;已上传至github&#xff0c;文本长度在20到30之间。一共10个类别&#xff0c;每类2万条。 类别&#xff1a;财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。 数据集划分&#xff1a; 数据集数据量…

Python 接口自动化测试中的深拷贝与浅拷贝~

前言 在编写接口自动化测试脚本时&#xff0c;我们经常需要复制数据结构来模拟不同的测试场景。Python 提供了两种拷贝机制&#xff1a;浅拷贝和深拷贝。理解这两种拷贝的区别对保证测试数据的一致性和准确性至关重要。 浅拷贝 vs 深拷贝 浅拷贝&#xff1a;只复制引用&#…

软件架构:依赖倒置原则的魅力

依赖倒置原则&#xff08;Dependency Inversion Principle, DIP&#xff09;是面向对象设计的基本原则之一&#xff0c;由罗伯特C马丁&#xff08;Robert C. Martin&#xff09;提出。这一原则旨在降低系统中各个组件之间的耦合度&#xff0c;提高系统的可维护性和可扩展性。 …

四川正信法律:借钱不还报警有没有用

在日常生活中&#xff0c;金钱往来是人际交往中不可或缺的一部分。然而&#xff0c;当借钱不还成为一种普遍现象时&#xff0c;人们往往会感到困惑和无奈。那么&#xff0c;面对借钱不还的情况&#xff0c;报警是否有用呢? 我们要明确一点&#xff0c;借钱不还属于民事纠纷&am…

注意力机制 — 它是什么以及它是如何工作的

一、说明 注意力机制是深度学习领域的一个突破。它们帮助模型专注于数据的重要部分&#xff0c;并提高语言处理和计算机视觉等任务的理解和性能。这篇文章将深入探讨深度学习中注意力的基础知识&#xff0c;并展示其背后的主要思想。 二、注意力机制回顾 在我们谈论注意力之前&…

TcpSocket在切后台后如何保活

1&#xff09;TcpSocket在切后台后如何保活 2&#xff09;Magica Clothes 2插件与Burst编译问题 3&#xff09;粒子拖尾合批失败怎么办 4&#xff09;如何让射线追踪跟随我FPS游戏的十字准星进行移动 这是第398篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

适合学生党的运动耳机都有哪些?五大适合学生党的运动耳机推荐

2024年春季&#xff0c;开放式蓝牙耳机就凭借“佩戴舒适、开放安全”等优势火热出圈&#xff0c;这让各大音频厂商更新迭代速度不断加快&#xff0c;新品层出不穷。而用户面对市场上琳琅满目的开放式蓝牙耳机&#xff0c;一时间也不知道如何选择。那么对于学生党来说&#xff0…

linux 基本指令讲解 下

基本指令 date 显示 date 指定格式显示时间:date%Y:%m:%d(冒号可以随便改) 在显示方面 %H : 小时(00..23) %M : 分钟(00..59) %S : 秒(00..61) %X : 相当于 %H:%M:%S %d : 日 (01..31) %m : 月份 (01..12) %Y : 完整年份 (0000..9999) %F : 相当于 %Y-%m-%d在时间设置方面 date…

依赖注入+中央事件总线:Vue 3组件通信新玩法

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-依赖注入-中央事件总线 大家好&#xff0c;依旧青山&#xff0c; 最近呢也随着需求的变更调优…

Prometheus部署和基本操作

1 项目目标 &#xff08;1&#xff09;对Prometheus有基本的了解 &#xff08;2&#xff09;能够部署出一套Prometheus看板系统 &#xff08;3&#xff09;对Prometheus界面熟悉 1.1 规划节点 主机名 主机IP 节点规划 prome-master01 10.0.1.10 服务端 prome-node01 …

java基础学习笔记1

Java编程规范 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a;_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式&#xff0c;更不允许直…

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代&#xff0c;社交媒体已经成为企业战略中不可或缺的一部分。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;提供了丰富的数据资源&#xff0c;这些数据不仅能够帮助企业了解市场趋势&#xff0c;还能提升业务决策的精准度。本文将探讨如何有效利用Fa…

CV党福音:YOLOv8实现实例分割(一)

前面我们得知YOLOv8不但可以实现目标检测任务&#xff0c;还包揽了分类、分割、姿态估计等计算机视觉任务。在上一篇博文中&#xff0c;博主已经介绍了YOLOv8如何实现分类&#xff0c;在这篇博文里&#xff0c;博主将介绍其如何将实例分割给收入囊中。 YOLOv8实例分割架构图 …

Spring Boot3.3.X整合Mybatis-Plus

前提说明&#xff1a; 项目的springboot版本为&#xff1a;<version>3.3.2</version> 需要整合的mybatis-plus版本&#xff1a;<version>3.5.7</version> 废话不多说&#xff0c;开始造吧 1.准备好数据库和表 2.配置全局文件application.properti…

本地连接服务器redis

详细步骤 1.看一下服务器上redis实例的运行状态&#xff1a; [rootiZuf67k70ucx14s6zcv54dZ var]# ps aux | grep redis-server若显示&#xff1a; 则说明服务器上的redis已经启动了&#xff0c;若没有&#xff0c;则请重启一下&#xff1a; sudo systemctl restart redis…

原来,考证还可以领取补贴Money

武汉ZF真的对打工人太好了&#xff0c;只要社保交满 12 个月就可以参加职业技能考试&#xff0c;考试通过就能领 2K 的补贴。 而且证考了对找工作工资也能比别人高几百&#xff0c;真的太爽了&#xff0c;有空的姐妹都去给我考&#xff01;&#xff01;&#xff01; 没空的也给…

思科三层交换机实现EIGIP路由协议6

#路由协议实现# #任务六三层交换机实现EIGIP路由协议6# #1配置计算机的IP地址、子网掩码和网关 #2配置Switch-A的名称及其接口IP地址 Switch(config)#hostname Switch-A Switch-A(config)#ip routing Switch-A(config)#int g0/1 Switch-A(config-if)#no switchport Switc…