计算机基础知识——C基础+C指针+char类型

news2024/12/22 21:24:25

指针

这里讲的很细
https://blog.csdn.net/weixin_43624626/article/details/130715839
内存地址:内存中每个字节单位都有一个编号(一般用十六进制表示)

存储类型 数据类型 *指针变量名;

int *p; //定义了一个指针变量p,指向的数据是int类型的。

访问指针所指向空间的内容用取内容运算符*
&:取地址符:取变量的地址

*:取内容符:取地址里面存放的内容
*&a=a;//*和&是互逆运算

&*a//错误(因为运算符优先级)

普通变量赋值

#include <stdlib.h>
int main()
{
    int a = 5;
    int *p = &a;
    char c='v';
    char *q=&c;
    printf("%p %p\n", p, &a);//p为a的地址
    printf("%p %p\n",q,&c);//q为c的地址
    printf("%d %d\n",a,*p);//*p是取地址中的值
    printf("%c %c\n",c,*q);//*q取地址中的值

    printf("Hello, World");
    return(0);
}

注意:指针变量使用前不仅要定义,还要初始化。未初始化的指针变量不能随便使用,不然可能会产生野指针。

通过改变指针指向,改变值

	int a=10;
    int *p=&a;
    int *q=p;
    printf("%d %d %d\n",a,*p,*q);//10 10 10
    *q=20;//通过指针改变变量a的值
    printf("%d %d %d\n",a,*p,*q);//20 20 20

数组

在这里插入图片描述

1.数组的首地址赋值给指针变量

char s[10]="hello";
char *p = s;
int arr[5]={1,2,3,4,5};
int *q=arr;
printf("%c\n",*p);//h
printf("%d\n",*q);//1

2.指针加减操作其实就是让指针向前向后移动
(1)char 移动1

	char str[32]="hello";
    char *p=str;
    printf("%c\n",*p);//h
    p++;
    printf("%c\n",*p);//e
    p--;
    printf("%c\n",*p);//h

(2)int 移动4
double 移动 8
偏移了多少字节=n*sizeof(数据类型)

char str[32]="hello";
    int *p=str;
    printf("%c\n",*p);//h
    p++;
    printf("%c\n",*p);//o
    p--;
    printf("%c\n",*p);//h

运算方法
(1)++和*都是单目运算符

(2)单目运算符从右向左运算

(3)++在前是先移动再取值,++在后是先取值再移动。

    int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px);//11
printf("%d\n%d", *px,x[0]);//11 

这个++*px把数组里的值给改了

int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px);//11
printf("%d\n", *px); //11
px = x;
printf("%d,", (*px)++);//11  先取值再+1,所以直接打印x[0]的值,然后再x[0]=11+1=12
printf("%d\n", *px);//12
px = x+1;
printf("%d,", *px++);//20 先取值再移位
printf("%d\n", *px);//30
px = x+1;
printf("%d,", *++px);//30 先移位再取值
printf("%d\n", *px);//30

二维数组

int a[2][3]={1,2,3,4,5,6};

a是数组名,表示第一行的首地址。

a+1表示第二行的首地址,以此类推。

在a前面加*,表示将行地址降级称为列地址。

*a;//第一行第一列的地址

*a+1;//第一行第二列的地址

*(a+1);//第二行第一列的地址

*(a+1)+1;//第二行第二列的地址
原文链接:https://blog.csdn.net/weixin_43624626/article/details/130715839
在这里插入图片描述

二级指针

存放指针的地址

int a = 10;

int *p = &a;

int **q = &p;

数组指针(指向数组)

本质还是指针,指向的是数组(又称为行指针)
存储类型 数据类型(* 指针变量名)[列数];

例如:

int a[2][3]={1,2,3,4,5,6};

int (*p)[3]=a;

p可以代替进行元素访问,但本质不同,p是指针变量,a是地址常量。

把p进行运算的时候,例题中情况要3个单位3个单位进行运算。

访问数组元素地址(a[i][j]的地址):

*(p+i)+j

p[i]+j

访问数组元素值:

((p+i)+j)

*(p[i]+j)

sizeof(p)=4//因为本质还是指针,所以大小都是四字节。

指针数组

指若干个具有相同存储类型和数据类型的指针变量构成的集合。其本质是数组,里面存放的是指针。
存储类型 数据类型 *数组名[元素个数];

指针数组名表示的是该指针数组的首地址。

例如:

int *arr[2];

int a=10,b=20,c=30;
int *p[3]={&a,&b,&c};

访问b的值:
*p[1]
**(p+1)

访问b的地址:
p[1]
*(p+1)

在这里插入图片描述

ASCII

A-65
a-97
相差32
在这里插入图片描述

循环队列

循环队列的相关条件和公式:
队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度
1.队空条件:rearfront
2.队满条件:(rear+1) %QueueSIze
front
3.计算队列长度:(rear-front+QueueSize)%QueueSize
4.入队:(rear+1)%QueueSize
5.出队:(front+1)%QueueSize

char

char s[]="abcd";
    char ss[]={'a','b','c','d'};
    
    printf("size=%ld\n",sizeof(s));//5
    printf("size=%ld\n",sizeof(ss));//4
    printf("size=%ld\n",strlen(s));//4
    printf("size=%ld\n",strlen(ss));//8

‘abcd’=‘a’,‘b’,‘c’,‘d’,‘\0’ 在C语言中,字符串以’\0’作为结束符
所以s长度比s多1
strlen()遇到’\0’停止计数,而数组y中没有’\0’,所以strlen()一直向后查找,直至查找到某个’\0’为止。
strlen统计字符串长度,遇到\0结束,且不统计\0sizeof计算开辟的空间大小

字符串

把字符串储存在char类型的数组中,如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串。
在这里插入图片描述
因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节用来存放\0,\0就是数字0。这是约定。
字符串采用双引号包含起来,如:“hello”、“你好”、“A”、“”,这是约定。

例题

1.内存占用大小和初始化

个字符占用一字节的内存,字符串定义时数组的大小就是字符串占用内存的大小。

memset(strname,0,sizeof(strname));  // 把全部的元素置为0

2.在C语言中,数组名是数组元素的首地址,字符串是字符数组,所以在获取字符串的地址的时候,不需要用&取地址

char strname[21];
memset(strname,0,sizeof(strname));
scanf("%s",strname);//acc
printf("%s\n",strname); //acc
printf("%c",strname[1]);//c

字符串的结尾标志是0

    char strname[21];
memset(strname,0,sizeof(strname));
scanf("%s",strname);//ac0cc
printf("%s\n",strname);  //ac0cc
strname[3]=0;//或strname[3]='\0';// 强制把第4个元素赋值0
printf("%s\n",strname); //ac0
printf("%c",strname[1]);//c

把赋值为0或’/0’后面的不要,变成内存中的垃圾值
4.字符串是字符数组,字符串越界就是数组越界。
5.
char i = 1;则i的ASCII就是1,在内存中就是0 0 0 0 0 0 0 1

char i = ‘1’;则i的ASCII就是字符‘1’的ASCII码49,就是0 0 1 1 0 0 0 1
将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是把该字符的相应ASCII代码放到存储单元中。
6.
在这里插入图片描述
【A选择:】数组越界。所以错误。
【B选择:】声明char类型,传入了数值数组,而数值会以char类型的ASCII编码写入。所以正确。
【C选择:】 数组声没明显不符合规范,左侧声明名后应加上[]。所以错误。
【D选择】:这种声名只能用字符型char等。所以错误。
对于D选项:

 int a[5]={'1'};//49,0,0,0,0 这样行,但D中等号右侧没有{}
 int a[5]={1};//1,0,0,0,0

在这里插入图片描述
‘e’ 的ASCII是101,而字符s第一个是’a’。也就是说只写这么个s就代表它的第一个值是s[0]
‘e’ - 'a’为两个字符之间的ASCII差值=4
8.
在这里插入图片描述
gets和scanf输入都是需要取地址,数组名a等价于首元素地址&a[0],a+1相当于&a[1]。所以D选项没有取地址才错。
参数类型为 char* 型,即 str ,它可以表示这个数组的首地址,所以B 正确
9.
在这里插入图片描述
BC选项:

int *s[8]; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int (*s)[8]; //定义一个数组指针,该指针指向含8个元素的一维数组,每个都指向对应的数组的每列 。

主要在于看运算符优先级:int *p[n]; 中,运算符[ ]优先级高;int (*p)[n]; 中( )优先级高。

数组作为实参时必须指定列数

否则可能产生歧义,所以D正确 。

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

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

相关文章

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

[小试牛刀-习题练]《计算机组成原理》之计算机系统概述【详解过程】

【计算机系统概述】 1、【冯诺伊曼结构】计算机中数据采用二进制编码表示&#xff0c;其主要原因是&#xff08;D&#xff09; I、二进制运算规则简单II、制造两个稳态的物理器件较为容易III、便于逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I、Ⅲ C.仅Ⅱ、Ⅲ D. I、Ⅱ、Ⅲ I…

redis 单节点数据如何平滑迁移到集群中

目的 如何把一个redis单节点的数据迁移到 redis集群中 方案&#xff1a; 使用命令redis-cli --cluster import 导入数据至集群 --cluster-from <arg>--cluster-from-user <arg> 数据源用户--cluster-from-pass <arg> 数据源密码--cluster-from-askpass--c…

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…

为什么Modbus链接/从机不通?From 摩尔信使MThings

为了回应用户平日里关于摩尔信使&#xff08;MThings&#xff09;使用过程中最常见的问题&#xff0c;包括“网络链接连不上”、“为什么不能增加串口”和“为什么从机不通”&#xff0c;我们在此统一介绍解决方法。 1、具备哪些通信能力 支持串口和网络两种通信方式。 需要…

我们后端程序员不是操作MyBatis的CRUD Boy

大家好&#xff0c;我是南哥。 一个对Java程序员进阶成长颇有研究的人&#xff0c;今天我们接着新的一篇Java进阶指南。 为啥都戏称后端是CRUD Boy&#xff1f;难道就因为天天怼着数据库CRUD吗&#xff1f;要我说&#xff0c;是这个岗位的位置要的就是你CRUD&#xff0c;你不…

FastAPI教程II

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial Cookie参数 定义Cookie参数与定义Query和Path参数一样。 具体步骤如下&#xff1a; 导入Cookie&#xff1a;from fastapi import Cookie声明Cookie参数&#xff0c;声明Cookie参数的方式与声明Query和Path参数…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue

CMSIS 2.0接口中的消息&#xff08;Message&#xff09;功能主要涉及到实时操作系统&#xff08;RTOS&#xff09;中的线程间通信。在CMSIS 2.0标准中&#xff0c;消息通常是通过消息队列&#xff08;MessageQueue&#xff09;来进行处理的&#xff0c;以实现不同线程之间的信息…

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

Java的IO体系

目录 1、Java的IO体系2、IO的常用方法3、Java中为什么要分为字节流和字符流4、File和RandomAccessFile5、Java对象的序列化和反序列化6、缓冲流7、Java 的IO流中涉及哪些设计模式 1、Java的IO体系 IO 即为 input 输入 和 output输出 Java的IO体系主要分为字节流和字符流两大类…

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念&#xff1a; 当我们做了一些操作 (update/delete/insert)&#xff0c;提交事务后要操作MySql中的数据。 为了能够提升性能&#xff0c;引入了两块区域&#xff1a;内存结构和磁盘结构。 磁盘结构&#xff1a; 主要存储的就是数据页&#x…

LeetCode 算法:二叉搜索树中第K小的元素 c++

原题链接&#x1f517;&#xff1a;二叉搜索树中第K小的元素 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a;…

页面开发感想

页面开发 1、 前端预览 2、一些思路 2.1、首页自定义element-plus的走马灯 :deep(.el-carousel__arrow){border-radius: 0%;height: 10vh; }需要使用:deep(标签)才能修改样式 或者 ::v-deep 标签 2.2、整体设计思路 <template><div class"card" style&…

机器学习第四十五周周报 SAM优化器

文章目录 week45 SAM优化器摘要Abstract1. 题目2. Abstract3. 锐度感知最小化3.1 问题提出3.2 方法提出 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现小结参考文献 week45 SAM优化器 摘要 本周阅读了题为Sharpness-Aware Minimization for Efficien…

! Warning: `flutter` on your path resolves to

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 1. 检查并更新.bash_profile或.zshrc文件 2.添加Flutter路径到环境变量 3. 加载配置文件 4.验证Flutter路径 5.重新启动终端 项目场景&#xff1a; 今天重新安装了AndroidStudio,并配置…

Postman设置请求间自动保存返回参数,方便后续请求调用,减少复制粘贴

postman中常常出现&#xff1a;有两个请求&#xff0c;一个请求首先获取验证码或者token&#xff0c;再由得到的验证码或token编写body发送另一个请求。如何设置两个请求间自动关联相关数据呢&#xff1f; 通过环境存储全局变量 现在有两个请求如下图&#xff0c;生成验证码是…

如何制作鼠标悬浮后伸缩的搜索框

引言 许多博客都在使用的伸缩搜索框制作教程 成品展示&#xff08;颜色自行搭配&#xff09; 初步布局 居中盒子&&初始化样式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

进程间通信简介-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

进程间通信简介 进程间通信简介 进程间进程简称IPC(interprocess communication)&#xff0c;进程间通信就是在不同进程之间传递信息或交换信息 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的…