C语言复习笔记 11

C语言期末复习|最后的总结 在 C 语言中,自定义标识符是由程序员为变量、函数、结构体、联合体、枚举、宏、标签等命名时使用的名称。1.大小写字母含义不同。APH 和 aph 代表不同的变量。2.C语言的标识符由字母、数字和下划线组成。3.第一个字符必须是字母或下划线。4.第一个字符不能是数字。9ab是非法的用户标识符。5.C语言中的变量名属于标识符。6.C 语言的关键字(保留字)是具有特殊含义的标识符,它们被 C 语言的编译器保留,不能用作变量名、函数名等普通标识符。7.main。 阅读详情

C语言数组指针 (指向数组的指针)

数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。

#include <stdio.h>
int main (void) 
{
    int arr[4] = {1,2,3,4};
    printf("arr=%p %p %p \n", arr, &arr[0], &arr[1]);

    return 0;
}
//运行结果——明白连续地址的概念了
0018FF38
0018FF38
0018FF3C
Press any key to continue

数组名的本意是表示整个数组,也就是表示多份数据的集合,但在使用过程中经常会转换为指向数组第 0 个元素的指针,所以我们说数组名可以认为是一个指针,但并不就是。也就表示了数组名和数组首地址并不总是等价。

下面的例子演示了如何以指针的方式遍历数组元素:

#include <stdio.h>
int main (void) 
{
    int arr[] = {1,2,3,4};
    int len = sizeof(arr) / sizeof(int);
    int *p = arr;
    for (int i = 0; i < 4; i++) {
        printf("%d ", *(p+i));
    }
    printf("\n");

    return 0;
}

如果一个指针指向了一个数组,我们就称它为数组指针(Array Pointer)。

需要注意的是:
sizeof(arr) / sizeof(int)不能改成 sizeof(p) / sizeof(int)
数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。

总结

引入数组指针后,我们就有两种方案来访问数组元素了,一种是使用下标,另外一种是使用指针。
1) 使用下标

也就是采用 arr[i] 的形式访问数组元素。如果 p 是指向数组 arr 的指针,那么也可以使用 p[i] 来访问数组元素,它等价于 arr[i]。

2) 使用指针

也就是使用 (p+i) 的形式访问数组元素。另外数组名本身也是指针,也可以使用 (arr+i) 来访问数组元素,它等价于 *(p+i)。

不管是数组名还是数组指针,都可以使用上面的两种方式来访问数组元素。不同的是,数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。

更改上面的代码,借助自增运算符来遍历数组元素:

#include <stdio.h>

int main(){
    int arr[] = { 99, 15, 100, 888, 252 };
    int i, *p = arr, len = sizeof(arr) / sizeof(int);

    for(i=0; i<len; i++){
        printf("%d  ", *p++ );
    }
    printf("\n");
    return 0;
}

第 8 行代码中,p++ 应该理解为 (p++),每次循环都会改变 p 的值(p++ 使得 p 自身的值增加),以使 p 指向下一个数组元素。该语句不能写为 *arr++,因为 arr 是常量,而 arr++ 会改变它的值,这显然是错误的。

对指针变量的运算,实际上是对变量中存储的地址的运算。int a = 1;内存给a分配的地址编号是0018FF44, int *p = &a; 故指针变量p中保存的是0018FF44,这个地址在内存中对应的数据是1(a); 语句p + 1,代表的是 对指针变量中存放的地址 + 4(int 内存4字节);就是现在指针变量中存放的地址是00FF48,至于这个地址对应的数据是多少,就不清了,如果没有定义的话。

 指针指向的数据运算符 * 和 自增++ 运算符优先级问题
获取指针指向的数据运算符 * 是低于 自增运算符++的 
     这里写图片描述


思考
假设 p 是指向数组 arr 中第 n 个元素的指针,那么 p++、++p、(*p)++ 分别是什么意思呢?
*p++

#include <stdio.h>
int main (void) 
{
    int arr[] = {3,8,11,33};
    int len = sizeof(arr) / sizeof(int);
    int *p = &arr[1];

    printf("%d\n", *p++);-------------- 3
    // 根据运算符优先级 *(p++)
    // * 取指针所存储的地址的数据
    // ++ 也就是 += 1
    // 对指针变量的运算,就是对指针变量存储的地址的运算,
    // p++ 也就是 p += 1; 也就是 p=p+1; 也就是指针变量p所存储的地             
    //址+4 (1个int占4字节);
    //数组中变量在内存中排列是连续的,也就是a[0] 占4个字节,,内存中
    //下4个字节是a[1],依次排列,
    // ++ 后自增运算符 表示先用变量的值,再之后对变量+1
    // 所以这里 *(p++) 表达式的值就是 *p的值,也就是arr[1],即3
    // 但是指针 p 指向了下一个数,也就是说 现在的p=&a[2]; *p即8
    printf("%d\n", *p);------------------- 8

    printf("\n");

    return 0;
}

*++p

#include <stdio.h>
int main (void) 
{
    int arr[] = {3,8,11,33};
    int len = sizeof(arr) / sizeof(int);
    int *p = &arr[1];


    printf("%d\n", *++p);  ------ 8 
    printf("%d\n", *p);    ------ 8
    //优先级 *(++p)
    // ++p 取之后的值
    // 也就是表达式的值现在为 *(p+1) 也就是 a[2]
    // 所以 *p 也是a[2]

    printf("\n");

    return 0;
}

(*p) ++

#include <stdio.h>
int main (void) 
{
    int arr[] = {3,8,11,33};
    int len = sizeof(arr) / sizeof(int);
    int *p = &arr[1];

    printf("%d\n", (*p)++);  --- 8
    printf("%d\n", *p);     ---- 9
    printf("%d\n", arr[1]); ---- 9
    // 优先级 括号优先级最高,所以先处理(*p) 也就是 a[1]的值
    // (*p)++ 也就是 a[1]++,表达式先取a[1]的值,然后对a[1]+=1
    // 也就是说现在 a[1]由原来的 8 变成了 9;


    printf("\n");

    return 0;
}

C语言字符串指针(指向字符串的指针)

C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中
char str[] = "hello world";

除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,例如:
char *str = "hello world";

字符串中的所有字符在内存中是连续排列的,str 指向的是字符串的第 0 个字符;我们通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char,所以 str 的类型也必须是char *。

strlen 和 sizeof 的区别

sizeof —— 内存
strlen——字符个数

sizeof() C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。

用法
sizeof(类型说明符,数组名或表达式);
或sizeof (变量名);

定义
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
深入理解sizeof操作符

strlen (C语言函数)
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

strlen只能用char*做参数,且必须是以”\0”结尾的。

char aa[10]=”jun”; cout<

两种表示字符串方式的区别

区别1

#include <stdio.h>
#include <string.h>
int main (void) {

    char *str1 = "hello world";
    char str2[] = "hello world";
    int len = sizeof(str1);
    int len1 = strlen(str1);
    int len2 = sizeof(str2);
    printf("%s \n%d\n%d\n%d\n", str1, len, len1, len2);


    return 0;
}

这里写图片描述

区别2
它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

内存权限的不同导致的一个明显结果就是,字符数组在定义后可以读取和修改每个字符,而对于第二种形式的字符串,一旦被定义后就只能读取不能修改,任何对它的赋值都是错误的。

#include <stdio.h>
int main(){
    char *str = "Hello World!";
    str = "I love C!";  //正确
    str[3] = 'P';  //错误

    return 0;
}

到底使用字符数组还是字符串常量

在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量。

最后总结一下,C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。

C语言期末复习笔记(下) 指针变量使用之前必须初始化。 阅读详情

相关推荐

STM32Cubemx+CanFestival:从零到一的CANopen移植实战

本文详细介绍了如何使用STM32CubeMX和CanFestival实现CANopen协议栈的移植,从开发环境搭建到核心配置步骤,再到调试与问题排查。通过实战经验分享,帮助开发者快速掌握STM32与CANopen的结合应用,提升嵌入式系统开发效率。

weixin_42558093的博客 420

C语言学习----字符串数组和字符串指针

C语言学习----字符串数组和字符串指针

成为富婆,报效祖国!! 3213

安卓app逆向破解脱壳教程

From:Hook 神器家族的 Frida 工具使用详解:https://blog.youkuaiyun.com/FlyPigYe/article/details/90258758 详解 Hook 框架 frida (信抢红包):https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】:https://www.jianshu.com/p/2d755beb1c54 frida 官网文档:https://fr..

sinat_28371057的博客 2万+

【C语言】字符串、字符数组、字符指针

目录 一、字符数组 (1)字符数组的定义 (2)字符数组的初始化 二、字符串 (1)字符串的概念 (2)用字符串初始化字符字符数组 (3)获取字符串的长度 三、字符串与指针 四、字符数组与字符指针 一、字符数组 字符数组是存放字符数据的数组,每个元素都是单个字符。 (1)字符数组的定义 char 数组名[数组长度];//一维字符数组 char 数组名[常量表达式1][常量表达式2];//二维字符数组 (2)字符数组的初始化 在数组定义的同时对数组中的元素进行赋值,这个过程

Jacky_Feng的博客 5658

【HarmonyOS】ArkUI的组件扩展

ArkuI的组件扩展主要是通过等装饰器来对于一些常用的自定义组件进行封装, 来简化UI开发流程, 提高自定义组件的可复用性。

2302_79763237的博客 1167

【上海大学计算机组成原理实验报告】五、机器语言程序实验

机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告

HackerKevon的博客 2188

C语言——字符串指针和字符串数组

在C语言中,字符串随处可见,字符串是由字符组成的一串数据,字符串以null字符('\0')结尾,表示字符串的结束。字符串可以通过字符数组或指针来表示和操作。

脑壳有点痒,好像要长脑子了! 5202

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1572

C语言字符串处理--字符数组和字符指针

2.1char str[]的str是一个指向字符类型的指针常量,不能被赋值(也就是str这个指针指向的地址不能被改变),我申请了存储空间,str这个指针常量指向的内存空间可以读写。10,但是只有前 6个元素被显式初始化为字符 'h'、'e'、'l'、'l'、'o'、'\0'。需要强调的是,这种自动初始化只适用于静态存储区或全局作用域中的数组,在局部作用域中定义的数组未被显式初始化时,其元素的值仍然是未定义的。②字符常量区的“abc”被系统自动分配了4个字节的内存空间--{‘a’,'b','c','\0'}

m0_62865498的博客 565

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 91

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1147

C++数组、字符串和指针

数组 数组就是一组名为数组元素或简称元素的内存位置,各个内存位置可以存储相同数据类型的数据项,我们可以用相同的变量名引用所有的内存位置。 存储各个元素所需的内存量取决于元素的类型,数组的所有元素都存储在连续的内存区域中。 声明数组 type arrayName[size]; 数组声明时,在紧随数组名的方括号内指出数组元素的数量。 初始化数组 type arrayName[size]{ value 1,value 2,...,value n}; 指定的初始值不能比数组元素多,但

hd51cc的博客 1513

使用ESP32设计嵌入式蓝牙游戏手柄

通过使用ESP32开发板和相关的库,我们可以设计和实现嵌入式蓝牙游戏手柄。连接到该设备后,您可以使用控制器模块的按钮和摇杆等元件来模拟游戏手柄的输入。根据您使用的具体模块和引脚分配,连接按钮和摇杆等控制元件到ESP32的GPIO引脚。ESP32是一款功能强大的微控制器,集成了Wi-Fi和蓝牙功能,非常适合用于开发物联网和嵌入式应用。请注意,本文仅提供了一个基于ESP32的嵌入式蓝牙游戏手柄设计示例,具体实现可能因硬件和需求而有所不同。确保开发板正确连接到计算机,并选择正确的开发板和端口。

CodeMaven的博客 1642

C语言学习及复习笔记-【11】结构体

用 **struct** 定义结构,struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下: ```c struct tag { member-list member-list member-list ... } variable-list ; ```

文斗士的专栏 599

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言复习笔记

C语言,编程入门基础。初学者必备!!!

lonelysnowman的博客 2930

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言复习笔记(一)C语言概论初识

从今天开始没有复习c语言的要抓紧时间了哦,如果不会复习的话,不妨跟着我一起来复习吧,现在小编已经结课了,反正闲着也是闲着,所以小编想用五天时间对c语言做一个系统性复习。欢迎大家一起来学习,互相指正,互相进步哦!加油,干就完了,奥利给!!! 不bb了,直入正题 第1章 C语言概论初识 (温馨提示,如果你看起来毫不费力,你就已经是大佬了哦,如果有些吃力,那就赶紧抓紧时间再学一遍吧,这个复习不针对小白哦) 最简单的C语言程序 【例1.1】要求在屏幕上输出:机械电子工程 解题思路: 在主函数中用printf函数原样

royal_77QAQ的博客 1588

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C/C++ 知识复习笔记

C/C++ 核心知识摘要

m0_63816268的博客 1955

C语言与Linux复习笔记

从定义角度分类库函数:是系统提供的已经封装好的函数。在使用时,需要包含相应的头文件。例如,常用的输入输出函数printfscanf等包含在<stdio.h>头文件中;字符处理函数isalphaisupper等包含在<ctype.h>头文件中;字符串处理函数strlenstrcpy等包含在<string.h>头文件中。这些库函数为程序员提供了便捷的功能,减少了重复开发的工作量。用户自定义函数:当系统提供的库函数无法满足特定需求时,程序员可以自己定义函数。

sbhsjjs的博客 1128

C语言复习笔记: PTA题集整理

C语言复习笔记: PTA题集整理 文章目录C语言复习笔记: PTA题集整理@[toc]C语言取模运算及辗转相除法易错内容:将/运算符当作%使用解答代码:算法实现1:算法实现2求出大于m的最小素数:PTA题集输入格式:输出格式:输入样例:输出样例:代码解答:课堂代码:存在问题 14 输出15改进后的代码:相似内容:遍历元素 并 输出或者返回数值 找素数7-3 求幂级数展开的部分和 (20分)输入格式:输出格式:输入样例:输出样例:需要注意的地方:代码内容解答代码1:修改后的代码:最佳情侣

weixin_44640697的博客 4951

C语言复习(专升本复习)

一个简单的C语言程序前言一、一个简单的C语言程序1.什么是C语言程序2.C语言的基本结构3.注意点 前言 提示:用于复习和分享c语言内容 因为要备考所以java暂时不更新建议看完c再去看java 所有顺序是按井冈山大学专升本复习大纲复习 提示:以下是本篇文章正文内容,下面案例可供参考 一、一个简单的C语言程序 示例: #inculde<stdio.h> void mian { //输出一句话 printf("hello word"); system("pause

qq_46567882的博客 4083

【C语言】C语言复习笔记

为什么要学C语言? 1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 总所周知,任何东西的盛行都只是一个阶段,语言也是如此。但是,C语言是个例外,一个矗立了半个世纪的语言,其中好坏,我想应该不难了之。 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖.

Cain Xcy的博客 2010

简单复习C语言

今天开始看晴神的《算法笔记》,由于本人大一学习完C语言后,一直在学习和使用Cpp的语法,以致于一些C语言的一些简单问题都不记得了,就顺便简单复习下C语言吧。 1.变量类型 _int16,_int32,_int64对应short,int,long long。 %f尽管是double和float的输出格式,但是可以将double的输出格式写出%lf 还有一点尽量多使用double,不要使用float,...

algsup 1216

C语言复习

C语言复习笔记1 一、数据类型、运算符与表达式 1.常量与变量 (1)常量分为:整型常量、实型常量、字符常量、字符串常量和符号常量。如:15是整型常量,3.14159是实型常量,‘a’是字符常量,"abc123"是字符串常量. (2)变量是指在程序运行过程中其值可以改变的量. 2.整型常量 (1)三种形式: 十进制:以非0开始的数,数码取值范围是0~9,可以是正数、负数,如25、-36、+23等。 八进制:以0开始的数,数码取值为0~7,如037、0123等。 十六进制:以0x或0X开始的数,数码取值为0~

yrr999的博客 3083

C 语言的指针复习笔记

指针是 C 语言的灵魂,其核心是 "通过地址间接操作内存"。指针的声明与初始化(指向有效内存);解引用()和取地址()的操作;指针与数组、函数的结合使用;动态内存分配中指针的管理;规避野指针、内存泄漏等常见错误。

xulibo5828的博客 736

C语言复习笔记--数组

如下图:我们通常用下标引用符[ ]来访问数组元素.例如我们访问。

2301_80159237的博客 1033
上一篇: C语言复习笔记 10
下一篇: C语言复习笔记 12
henhaoji_123
博客等级 码龄10年 260粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值