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

指针

这里讲的很细
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.mfbz.cn/a/756680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Redis中使用Lua脚本实现多条命令的原子性操作

Redis作为一个高性能的键值对数据库&#xff0c;被广泛应用于各种场景。然而&#xff0c;在某些情况下&#xff0c;我们需要执行一系列Redis命令&#xff0c;并确保这些命令的原子性。这时&#xff0c;Lua脚本就成为了一个非常实用的解决方案。 问题的提出 假设我们有一个计数…

【深度学习】图形模型基础(2):概率机器学习模型与人工智能

1.引言 1.1.背景 当机器需要从经验中汲取知识时&#xff0c;概率建模成为了一个至关重要的工具。它不仅为理解学习机制提供了理论框架&#xff0c;而且在实际应用中&#xff0c;特别是在设计能够从数据中学习的机器时&#xff0c;概率建模展现出了其独特的价值。概率框架的核…

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

汽车电子工程师入门系列——CAN 规范系列通读

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

SiteSucker Pro for Mac:一键下载整站,轻松备份与离线浏览!

SiteSucker Pro for Mac是一款专为苹果电脑用户设计的网站下载与备份工具&#x1f578;️。它以其强大的整站下载能力和用户友好的界面&#xff0c;成为了众多Mac用户备份网站、离线浏览的得力助手&#x1f4bb;。 这款软件允许用户一键下载整个网站&#xff0c;包括所有的网页…

Docker(八)-Docker运行mysql8容器实例

1.运行mysql8容器实例并挂载数据卷 -e:配置环境变量 --lower_case_table_names1 设置忽略表名大小写一定要放在镜像之后运行mysql8容器实例之前&#xff0c;先查看是否存在mysql8镜像以及是否存在已运行的mysql实例docker run -d -p 3306:3306 --privilegedtrue -v 【宿主机日…

L03_Redis知识图谱

这些知识点你都掌握了吗?大家可以对着问题看下自己掌握程度如何?对于没掌握的知识点,大家自行网上搜索,都会有对应答案,本文不做知识点详细说明,只做简要文字或图示引导。 Redis 全景图 Redis 知识全景图都包括什么呢?简单来说,就是“两大维度,三大主线”。 Redis …

MySQL连接IDEA(Java Web)保姆级教程

第一步&#xff1a;新建项目(File)->Project 第二步&#xff1a;New Project(JDK最好设置1.8版本与数据库适配&#xff0c;详细适配网请到MySQL官网查询MySQL :: MySQL 8.3 Reference Manual :: Search Results) 第三步&#xff1a;点中MySQLTest(项目名)并连续双击shift键-…

昇思25天学习打卡营第2天|数据集Dataset

学习目标&#xff1a;熟练掌握mindspore.dataset mindspore.dataset中有常用的视觉、文本、音频开源数据集供下载&#xff0c;点赞、关注收藏哦 了解mindspore.dataset mindspore.dataset应用实践 拓展自定义数据集 昇思平台学习时间记录: 一、关于mindspore.dataset minds…

【STM32】在标准库中使用定时器

1.TIM简介 STM32F407系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器。通常情况下&#xff0c;先看定时器挂在哪个总线上APB1或者APB2&#xff0c;然后定时器时钟需要在此基础上乘以2。 2.标准库实现定时中断 #ifndef __BSP_TIMER_H #define __BSP_TIMER_H#if…

.[emcrypts@tutanota.de].mkp勒索病毒新变种该如何应对?

引言 在数字化时代&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏力的恶意软件&#xff0c;给个人和企业带来了巨大的经济损失和数据安全风险。近期&#xff0c;一种名为“.mkp勒索病毒”的新型威胁开始在网络…

多线程引发的安全问题

前言&#x1f440;~ 上一章我们介绍了线程的一些基础知识点&#xff0c;例如创建线程、查看线程、中断线程、等待线程等知识点&#xff0c;今天我们讲解多线程下引发的安全问题 线程安全&#xff08;最复杂也最重要&#xff09; 产生线程安全问题的原因 锁&#xff08;重要…

在 Python 中创建列表时,应该写 `[]` 还是 `list()`?

在 Python 中&#xff0c;创建列表有两种写法&#xff1a; # 写法一&#xff1a;使用一对方括号 list_1 []# 写法二&#xff1a;调用 list() list_2 list() 那么哪种写法更好呢&#xff1f; 单从写法上来看&#xff0c;[] 要比 list() 简洁&#xff0c;那在性能和功能方面…

江科大笔记—读写内部闪存FLASH读取芯片ID

读写内部闪存FLASH 右下角是OLED&#xff0c;然后左上角在PB1和PB11两个引脚&#xff0c;插上两个按键用于控制。下一个代码读取芯片ID&#xff0c;这个也是接上一个OLED&#xff0c;能显示测试数据就可以了。 STM32-STLINK Utility 本节的代码调试&#xff0c;使用辅助软件…

[机缘参悟-200] - 对自然、人性、人生、人心、人际、企业、社会、宇宙全面系统的感悟 - 全图解

对自然、人性、人生、人心、人际、企业、社会、宇宙进行全面系统的感悟&#xff0c;是一个极其深邃且复杂的主题。以下是对这些领域的简要感悟&#xff1a; 自然&#xff1a; 自然是人类生存的根基&#xff0c;它充满了无尽的奥秘和美丽。自然界的平衡和循环规律&#xff0c;教…

运算符重载之日期类的实现

接上一篇文章&#xff0c;废话不多说&#xff0c;直接上代码 Date.h #pragma once #include<iostream> using namespace std; #include<assert.h>class Date {//友元函数声明friend ostream& operator<<(ostream& out, const Date& d);friend …

学编程容易遇到的误区,请提前规避

随着互联网行业的蓬勃发展和编程技术的普及&#xff0c;越来越多的人开始对编程感兴趣。然而&#xff0c;编程学习并非一蹴而就&#xff0c;新手入门时常常会陷入误区&#xff0c;影响学习状态效率。 今天&#xff0c;我们来一起揭开编程学习常见的五大误区&#xff0c;希望能…

Workbench密码登录登录失败

Workbench密码登录登录失败操作系统禁用了密码登录方式&#xff0c;会导致使用了正确的用户名和密码仍无法登录 sudo vim /etc/ssh/sshd_config 输入O进入编辑 改完后重启 systemctl restart sshd.service 登录报错 有试了几遍登上了 可能是改完还要等一会儿

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数&#xff1a; 函数二 函数三 主函数 运行结果 src&#xff1a; model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征&#xff0c;实现高准确度的身份识别。…

账做错了怎么办?看完这篇三分钟学会调错账|柯桥职业技能培训

作为会计遇到错账、漏账在所难免。既然错误在所难免&#xff0c;如果纠正错误就十分重要。今天就跟小编一起学下如何调账。 在处理错账之前&#xff0c;我们首先要把会计科目做一下分类&#xff0c;以便于我们找到错账的类型和原因。会计科目可以分为资产负债类科目&#x…