c语言指针

c语言中的string

百般思念 提交于 2020-01-10 12:28:24
1. strlen(char const* s);   函数传入的是c风格字符串(即以‘\0’结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'。 2. strcpy(char* dest, char const* source);   dest:目标指针;   source:是源指针,传入的必须是c风格字符串或者字符数组。   返回值: dest指针   注意:1. 该函数会将包括'\0'在内的source全部拷贝到dest。如果char* source="abcd"; dest为char[],则dest应该定义为char[5];       2. src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。       3. C语言中不支持用赋值符号“=”直接将一个字符数组赋值给另一个字符数组。因为C语言不支持运算符重载。故而必须用strcpy操作。 3. strncpy(char* dest, char const* source, size_t n);   n代表可以指定字符个数进行赋值。   功能:将字符串source中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度

2019春第六周作业

落花浮王杯 提交于 2020-01-10 08:33:16
第六周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/2890 我在这个课程的目标是 了解指针的用法 这个作业在那个具体方面帮助我实现目标 利用指针做题 参考文献 C语言程序设计II 一、本周完成的作业 基础作业 函数题 6-1 求两数平方根之和 (10 分) 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1)

基于文件指针的文件操作

核能气质少年 提交于 2020-01-10 00:26:12
基于文件指针的文件操作(缓冲) linux的文件和文件描述符 linux中对目录和设备的操作都是文件操作,文件分为 普通文件,目录文件,链接文件和设备文件 。 普通文件 :也称磁盘文件,并且能够进行随机的数据存储 ( 能够自由 seek 定位到某一个位置 ) ; 管道: 是一个从一端发送数据,另一端接收数据的数据通道; 目录: 也称为目录文件,它包含了保存在目录中文件列表的简单文件。 设备: 该类型的文件提供了大多数物理设备的接口。它又分为两种类型: 字符型设备和块设备。 字符型设备 一次只能读出和写入一个字节的数据,包括调制解调器、终端、打印机、声卡以及鼠标; 块设备 必须以一定大小的块来读出或者写入数据,块设备包括 CD-ROM 、 RAM 驱动器和磁盘驱动器等 ,一般而言,字符设备用于传输数据,块设备用于存储数据。 链接: 类似于 Windows 的快捷方式和 Linux 里的别名,指包含到达另一个 文件路径的文件。 套接字: 在 Linux 中 , 套接字也可以当作文件来进行处理。 基于文件指针的文件操作函数是ANSI 标准函数库 的一部分。 1文件的创建,打开与关闭 原型为: #include <stdio.h> //头文件包含 FILE *fopen(const char *pach,const char *mode); //文件名 模式 int fclose(FILE

Linux C语言:指针与内存

二次信任 提交于 2020-01-10 00:08:49
1 . 计算机中的数据表示方法 单位:字节(byte) 1byte = 8 bit 计算用二进制 显示为十进制 编程为十六进制 2 . 内存管理 Q : 32位系统 最大使用4G内存? A : 32位系统,地址总线是32位,也就是寻址空间是32位; 32位指的是:给内存编号只能编到32个二进制位; 32根地址总线就是2 32 个状态; 2 32 = 2 10 *2 10 *2 10 *4=1k * 1k * 1k *4=1M * 1k *4=4G 64位系统可以管理2 64 (4G*4G)的内存 地址从0x0000 0000 0000 0000 到 0xFFFF FFFF FFFF FFFF 任意一个地址可以储存1个字节也就是8位2进制 其中,代码放在 代码段; 全局变量、常量、静态变量放在 数据段; 局部变量放在 栈; 3 . 变量和指针的本质 变量的本质是什么? 变量名它只是一个代号,代表一个内存地址空间 变量的本质就是内存 C语言无法对某个内存进行直接操作 指针也是变量,保存的就是内存地址 指针的本质就是地址 4 . 操作系统对内存的管理 32bit操作系统 : 指针4个字节 64bit操作系统 : 指针8个字节 只要是地址,不管指向什么类型,所占字节数都是相同的,指向函数地址也是一样。 5 . 函数栈以及数据段内存 最先分配的栈地址最大,从栈顶向下分配; 栈的特点:先进后出

【C语言笔记】#define与typedef的区别

≡放荡痞女 提交于 2020-01-09 18:53:05
1、#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。 2、typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。 typedef取别名的一般形式为: typedef 旧名字 新名字 3、define与typedef的区别 (1)#define之后不带分号,typedef之后带分号。 (2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如: #define INT1 int unsigned INT1 n; //没问题 typedef int INT2; unsigned INT2 n; //有问题 INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。 (3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如: #define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2;

[C++]C++面试知识总结

只谈情不闲聊 提交于 2020-01-08 23:40:04
1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS段:存放未初始化的static变量和全局变量 Data段:存放初始化过的static变量和全局变量 Text段:存储程序的二进制代码,程序代码区。   堆:程序运行时通过malloc申请的内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。 栈:执行函数时,函数的局部变量存储在栈中,执行结束后自动释放该内存区域,栈内存分配运算内置与处理器指令集中。 C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区。 1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 堆溢出:程序申请了资源但忘记释放该资源,造成内存泄露,累积泄露内存过多会造成内存溢出。 1.3 内存泄露和检测 C++内存泄漏检测内存泄露是指程序中动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。 动态内存泄露检测:检查new

C语言指针/指向指针的指针

别来无恙 提交于 2020-01-08 04:36:12
先看一段代码: 1 #include <stdio.h> 2 3 int main () 4 { 5 int i = 30; 6 int* pi; 7 int** ppi; 8 9 pi = &i;10 ppi = π11 12 printf("i = %d;\t &i = %d\n", i, &i);13 printf("pi = %d;\t &pi = %d;\t *pi = %d\n", pi, &pi, *pi);14 printf("ppi = %d;\t *ppi = %d;\t &ppi = %d;\t **ppi = %d\n", \15 ppi, *ppi, &ppi, **ppi);16 17 return 0;18 } 执行结果: i = 30; &i = -1013781316 pi = -1013781316; &pi = -1013781328; *pi = 30 ppi = -1013781328; *ppi = -1013781316; &ppi = -1013781336; **ppi = 30 下面用一个简单的图来说明一下: 定义指针类型时,用下面的格式,感觉更容易理解: int *p;    =>   int* p; int **pp;   =>   int** pp; =>右边的写法可以更加明确的看出int*, int**是变量类型,p,

C语言中的强制类型转换

纵然是瞬间 提交于 2020-01-08 04:18:42
C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; ( 假设它们所占的字节分别是 4 、 8 、 8 、 10 ,而且连续存储于某个地址空间,起始地址是 100 ,则我们可以得到如下内存分布 ) a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to***的规则进行强制转转换。如果是(类型名

C语言指针类型 强制转换

坚强是说给别人听的谎言 提交于 2020-01-08 01:50:40
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; (假设它们所占的字节分别是 4、 8、 8、 10,而且连续存储于某个地址空间,起始地址是 100,则我们可以得到如下内存分布 ) a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to**

二维数组和二维指针作为函数的参数

江枫思渺然 提交于 2020-01-07 18:09:37
不管是在工作上,还是最近在LeetCode上刷题。都错误的认为 二维数组 和 二维指针作为函数的参数时是等价的。这种认知是错误的。究其原因,还是对数组和指针理解的不深入。今天把我的理解做一个总结: 假如一个函数的形参是一个二维指针,但是你实参传入的是一个二维数组。那么你就会编译报错。 为什么我会错误的认为二维数组作为函数参数的时候等价于二维指针呢? 我思考了我为什么会这么想的原因了:一维数组作为函数参数的时候,编译器会把数组名当作指向该数组第一个元素的指针。所以我想当然的以为:既然一维数组和一维指针在函数参数中等价,那二维数组应该就等价于二维指针啊。 但是很遗憾,二维数组作为函数参数并等价于二维指针。因为 数组作为函数参数时转换为指针没有传递性 。也就是说你不能认为一维数组和一维指针作为函数参数等价,就认为二维数组和二维指针就等价了。在C语言中没有这样的传递性。 其实仔细想想,也是很容易明白的。二维数组其实就是一个数组的数组(即它是一个一维数组,只不过它的每个元素又都是一个一维数组)。当二维数组作为函数入参时,比如 int a[3][4]; 它的第一维数组会被转换成指针,相当于是传入了一个指向数组的指针。即作为函数参数, int a[3][4]和 int (*p)[4]等价。那 int (*p)[4]和 int **pp等价吗?肯定不等价呀, p指针指向类型是 int [4]