c语言指针

5/27 C语言 指针系列

时间秒杀一切 提交于 2020-03-03 21:07:09
1、序。数据在内存中是如何存储的,又是如何读取的? 在程序中定义一个变量,在对程序进行编译的时候,系统会给这个变量分配内存单元。编译系统根据程序中定义变量类型,分配一定长度的空间。 2、指针。 地址指向该变量的单元,地址指向该变量的单元,将地址形象化称作为指针,就是通过它能够找到以他为地址的内存单元。 3、访问。 访问分为直接访问和间接访问,直接访问是直接读取一个数据的地址,间接访问是通过中介访问自己的数据的地址,一般要进行两步以上。 4、指向。 一个变量的地址称为变量的指针,指针是通过地址来体现的。假设i_pointer中的值是变量i的地址的变量(2000),这样就在i—pointer和变量i中建议一种联系,通过i—pointer就知道i的地址,从而找到i的内存单元 来源: https://www.cnblogs.com/serious123/p/10934385.html

const关键字与指针

ぐ巨炮叔叔 提交于 2020-03-03 20:58:31
const关键字与指针 1、const关键字,在C语言中用来修饰变量,表示这个变量是常量。 2、const修饰指针有4种形式, 第一种:const int *p1; //p本身不是const的,而p指向的变量是const的 *p1 = 3;//错误的,const变量不能修改 p1 = 3; //正确的 第二种:int const *p2; //p本身不是const的,而p指向的变量是const的 *p2 = 3;//错误的,const变量不能修改 p2 = 3; //正确的 第三种:int * const p3; //p本身是const的,而p指向的变量不是const的 *p3 = 3;//正确的 p3 = 3; //错误的,const变量不能修改 第四种:const int * const p4; //p本身是const的,而p指向的变量是const的 *p4 = 3;//正确的 p4 = 3; //正确的 3、关于指针变量的理解,主要是涉及到两个变量:第一个是指针变量p本身,第二个是p指向的那个变量。一个const 只能修饰其中一个变量。 4、const在实际使用过程中,并不是一定不能被修改,通过一些特定的方法(比如说是指针)也是可以被修改掉的。 只是大部分情况下,我们既然定义了const类型的变量,就不会去修改这个变量。所以指针使用的时候,一定要谨 慎

c语言 关键字之typedef 详解

本秂侑毒 提交于 2020-03-03 06:34:01
 在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。   那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明: (1)基本数据类型定义   有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下:   typedef unsigned char uint8_t; //无符号8位数   typedef signed char int8_t; //有符号8位数   typedef unsigned int uint16_t; //无符号16位数   typedef signed int int16_t; //有符号16位数   typedef unsigned long uint32_t; //无符号32位数   typedef signed long int32_t; //有符号32位数   很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时

C风格字符串

大城市里の小女人 提交于 2020-03-02 21:08:55
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯书写的字符串存放在字符数组中并以空字符串结束。以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符('\0')。一般利用指针来操作这些字符串。 C标准库String函数 下表列出了C语言标准库提供的一组函数,这些函数可用于操作C风格字符串,它们定义在出string头文件中,出string是C语言头文件string.h的C++版本。 C风格字符串的函数 strlen(p)      返回p的长度,空字符不计算在内 strcmp(p1,p2) 比较p1和p2的相等性。如果p1==p2,返回0;如果p1>p2,返回一个正值;如果p1<p2,则返回一个负值 strcat(p1,p2)    将p2附加到p1之后,返回p1 strcpy(p1,p2)    将p2拷贝给p1,返回p1 传入此类函数的指针必须指向 以空字符作为结束的数组 : char ca[]={'c','+','+'}; //不以空字符结束 cout<<strlen(ca)<<endl; //严重错误

C++中四种强制类型转换区别详解

情到浓时终转凉″ 提交于 2020-03-02 13:22:19
 C++即支持C风格的类型转换,又有自己风格的类型转换。C风格的转换格式很简单,但是有不少缺点的:   1.转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。   2.C风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。   C++风格完美的解决了上面两个问题。1.对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;2.类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast. 一、static_cast转换   1.基本用法:static_cast<type-id> expression   2.使用场景:   a、用于类层次结构中基类和派生类之间指针或引用的转换   上行转换(派生类---->基类)是安全的;   下行转换(基类---->派生类)由于没有动态类型检查,所以是不安全的。   b、用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证   c、把空指针转换成目标类型的空指针   d

C语言学习笔记<八>

别来无恙 提交于 2020-03-02 06:40:14
通过使用联合可以用不同的方式操作内存中同一段区域。 计算机中存储数据的方式有两种,把低位数据存储在低地址字节中的方式叫做小端存储方式,相反就叫大端存储方式,我们的计算机采用的是小端存储方式。 使用枚举类型可以把一组名称转换成整数,从数字0开始。 堆里的变量的生命周期是由程序员来管理的, 可以使唤用C语言提供的函数对堆中的变量进行管理,为了使用这些函数需要包含头文件stdlib.h。 malloc函数可以从堆中分配指定个数的连续字节把首字节地址返回。如果失败则返回NULL . free 函数可以把堆中的变量释放掉,需要首字节地址作为参数。 calloc 函数也可以从堆中分配变量,并且保证把变量都清0. realoc 函数可以调整一段已经分配好的内存空间的大小。如果失败返回空地址。特殊情况下操作效果类似于malloc 或free.0 const 指针有两种声明方法 const int *p_value; int * const p_value; 前一种指针表示的整数变量不可以被修改 后一种指针表示的指针变量本身不可以被修改。 二级指针变量用来记录一级指针变理的地址,声明方法如下 int **pp_value; 二级指针变理可以用来表示它自己和对应的一级指示变量以及整数变量,使用方法如下 pp_value 表示二级指针 *pp_value 表示对应的一级指针。 **pp_value

C语言文件操作详解

限于喜欢 提交于 2020-03-02 04:13:23
C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志               ftell 了解文件指针的当前位置       文件定位函数 rewind 反绕              

c语言文本局部修改

好久不见. 提交于 2020-03-02 01:03:55
文章目录 一、借助新建文件 二、文件指针定位覆盖 1. 得到待修改的数据在文件中的位置 2. 将文件内部指针定位到该位置 3. 写入新数据到文件 两种方法修改局部数据 一、借助新建文件 //已在内存中修改过单行数据后直接调用该函数 void RebuildFile ( List a ) //List为结构体指针,指针a指向已修改部分链表 { int num1 ; char name1 [ 100 ] ; double source ; FILE * p1 = fopen ( "...\\date.txt" , "r" ) ; FILE * p2 = fopen ( "...\\date2.txt" , "w+" ) ; //新建date2.txt while ( fscanf ( p1 , "%d%s%lf" , & num1 , name1 , & source ) == 3 ) { if ( strcmp ( a -> name , name1 ) ) //未修改部分直接存入 fprintf ( p2 , "%d %s %.2lf\n" , num1 , name1 , source ) ; else fprintf ( p2 , "%d %s %.2lf\n" , a -> num , a -> name , a -> source ) ; //修改后数据存入 }

为什么要使用指针? [关闭]

随声附和 提交于 2020-03-01 22:20:05
我知道这是一个非常基本的问题,但是在使用高级语言编写了一些项目之后,我才开始进行一些基本的C ++编程。 基本上我有三个问题: 为什么在普通变量上使用指针? 我应该在何时何地使用指针? 如何将指针与数组一起使用? #1楼 在变量上使用指针的一种方法是消除所需的重复内存。 例如,如果您有一些大型的复杂对象,则可以使用指针为您所做的每个引用指向该变量。 使用变量,您需要为每个副本复制内存。 #2楼 在某些情况下,需要使用函数指针才能使用共享库(.DLL或.so)中的函数。 这包括跨语言执行操作,通常会提供DLL接口。 制作编译器 做科学的计算器,在哪里有函数指针的数组或向量或字符串映射? 尝试直接修改视频内存-制作自己的图形包 制作一个API! 数据结构-您正在制作的特殊树的节点链接指针 指针有很多原因。 如果您想保持跨语言兼容性,则在DLL中进行C名称处理尤其重要。 #3楼 这是我的助手,我不会答应成为专家,但是我发现指针在我要编写的其中一个库中很棒。 在这个库中(这是带有OpenGL的图形API :-),您可以创建一个三角形,并向其中传递顶点对象。 draw方法采用这些三角形对象,并根据我创建的顶点对象来绘制它们。 好吧,没关系。 但是,如果我更改顶点坐标怎么办? 用顶点类中的moveX()移动它还是其他东西? 好吧,好的,现在我必须更新三角形,添加更多的方法,并且浪费了性能

C++程序设计(面向对象进阶)崔毅东 ——第3单元第01节空指针和动态内存分配

蓝咒 提交于 2020-03-01 20:23:51
nullptr and Dynamic Memory Allocation (空指针和动态内存分配) 1. 空指针 1.1. 0带来的二义性问题 C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。 C语言中,空指针使用(void *)0来表示 有时候,用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0) 1.2. C++标准化委员会希望“空指针”是一个确定的东 C++11中引入保留字“nullptr”作为空指针 2. Dynamic memory management: Allocate/Release (动态内存管理:分配/释放) 2.1. C++中通过运算符new申请动态内存 new <类型名> (初值) ; //申请一个变量的空间 new <类型名>[常量表达式] ; //申请数组 如果申请成功,返回指定类型内存的地址; 如果申请失败,抛出异常,或者返回空指针(nullptr)。(C++11) 2.2. 动态内存使用完毕后,要用delete运算符来释放。 delete <指针名>; //删除一个变量/对象 delete [] <指针名>; //删除数组空间 2.3.c和c++关于动态内存分配的区别 3.空指针和动态内存分配代码示例 # include <iostream> int main ( ) { int * p =