指针变量

指针常量、常量指针、指向常量的指针常量的区别以及数组名的本质

◇◆丶佛笑我妖孽 提交于 2020-01-29 05:46:56
1、指针常量(*const):对应指针变量,即指针本身是常量,指针指向的内容可以被修改。 数据类型 * const 指针变量=变量名(或取地址); int * const p ; 2、常量指针(const*):常量的指针,即指针指向的内容不能被修改,但指针本身是变量,可以被修改。 数据类型 const * 指针变量=变量名(或取地址); int const * p ; const int * p ; //都可以 3、指向常量的指针常量:即指针本身是常量,指向的内容也是常量,都不能修改。 -const 数据类型 * const 指针变量=变量名(或取地址); const int * const p ; 4、数组名 指针和数组名在本质上是不同的, 1,指针是地址变量,而数组名是地址常量 数组名本质上是一个 地址常量 ,不是指针,不管是指针常量还是常量指针都不是,之所以在实际编程中,数组名表现出“是”指针的样子,那是因为经过隐式转换形成的,而不是数组名本身具有的 指针与地址的区别:   1、指针和地址最大的区别就是指针是有类型的,地址是没有类型的。我们当然可以通过绝对地址的方式找到函数和数据,但是地址是没有类型的,不能对地址进行算术操作,在涉及诸如数组等操作时就不能通过地址的自增和自减来访问数组的各个变量。   2、指针是由地址和类型两部分构成的

实验报告(2019年6月12日)

拜拜、爱过 提交于 2020-01-29 04:54:17
c程序实验报告 姓名:黄志乾 实验地点:教学楼514教室 实验时间:4月30日 实验项目: 1、指针基础及指针运算 2、数据交换 3、输出指定行数的杨辉三角形 4、数组元素奇偶排列 一、实验目的与要求 1.指针基础及指针运算 ● 本实验旨在及爱情学生对指针数据类型的理解,熟悉指针的定义、通过指针间接访问变量 2.数据交换 ● 本实验旨在加强学生对指针类型作为函数参数传递的理解,通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即是按地址。 实验要求: ● 定义两个函数,分别为void swap1(int a ,int b)和void swawp2(int a,int b),用于交换a,b的值。 ● 从主函数中分别输入两个整型变量a、b ●从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果 3.字符串翻转及字符串连接 ● 本实验旨在加强学生对字符指针以及将指针作为函数的返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符串在内存中是连续存放的,起开始地址为指向该字符串的指针值,字符串均以'\0'作为结束字符 实验要求 ●定义两个字符指针,通过gets()函数输入两个字符串 ●定义一个函数char reverse(char str),通过指针移动方式将字符串反转 ●定义一个函数char link(char str1,char *str2

c/c++常见面试题一

╄→гoц情女王★ 提交于 2020-01-29 04:04:13
找工作这么多天了,贴一下常见基础题吧,谁找工作了还可以复习下。答案有的是缺少很多,想看全百度之谷歌之... 1.进程与线程的区别:   很长重点写了:一个程序必须有一个进程,一个进程要有一个线程。   进程在运行时有独立的内存单元,而线程则是共享内存单元,所以一个线程死掉这个进程就会死掉,但是一个进程死掉程序无所谓。所以多进程程序比多线程要      稳定。   2.c++函数传递参数的方式:   1.直接传递、引用、指针。   他们的优缺点:   1.按值传递,在传递的时候实参被复制了一份,然后在函数体内使用。如果修改函数体内的拷贝,而实参是没有改变的。   2.引用是别名,所以效率别指针快,也比指针安全。(优先使用引用而不使用指针)   3.按值传递和引用传递在传参过程中,都执行强类型检查,而指针传递的类型比较弱,如果参数被声明为void*基本上没有类型检查,只要是指针编译器就认为是合法的,所以这会造成BUG。   4.指针可以干引用的活,而且还可以传递空指针,特别函数特别应用。但是指针用起来本身就很麻烦,如非需要还是不用。 *3.什么是深拷贝和浅拷贝    深拷贝:拷贝了对象的资源,在新对象中又建立了一个新的字段把资源放进去,如果修改其一,另一个不会改变。    浅拷贝:没有拷贝对象资源,它们共享资源,如果改变其一另一个也会随之改变。 4.面向对象的三个基本特征   1)封装

C++知识点汇总文档

蓝咒 提交于 2020-01-29 03:14:26
C++知识点汇总文档 持续更新 朝花夕拾. 不写下来, 仿佛一切都没了见证. 编程来源于生活, 无非是对现实的抽象. 整理这份文档的时候我才发现, 自己对C++的了解无非是冰山一角 另, C++11真的 太恐怖了 , 新"特性"真的是"恐怖如斯" 另注: 本人才疏学浅, 难免有错漏之处, 还望不吝赐教 1.基本概念 内存管理 C++中的内存划分(内容来自 博客 ): 堆 由用户使用new delete关键字管理的内存区域 栈 栈中用来存放临时变量, 比如函数中的局部变量, 在代码块结束时会自动清除 自由存储区 由malloc等分配的内存块, 他和堆是十分相似的, 不过它是用free来结束自己的生命的 全局/静态存储区 全局变量和静态变量被分配到同一块内存中 常量存储区 比较特殊的存储区, 他们里面存放的是常量(不太了解, 有空扫下盲) new 关键字 用来在内存(堆)中开辟一块空间, 用户获得一个指向内存中目标位置的指针 用法 参考示例 //申请一块指向单个int对象的内存, 并将值初始化为"5" int *ptr_0 = new int(5); //申请一块指向5个连续int类型对象的内存 //使用C++11统一的花括号初始化, 直观地对内存进行初始化 int * ptr_1 = new int[5]{1,2,3,4,5}; delete 关键字 删除 使用new申请的内存 用法

基于C的文件操作

喜夏-厌秋 提交于 2020-01-29 03:02:30
在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下: 1 typedef struct { 2 int level; /* fill/empty level of buffer */ 3 unsigned flags; /* File status flags */ 4 char fd; /* File descriptor */ 5 unsigned char hold; /* Ungetc char if no buffer */ 6 int bsize; /* Buffer size */ 7 unsigned char _FAR *buffer; /* Data transfer buffer */ 8 unsigned char _FAR *curp; /* Current active pointer */ 9 unsigned istemp; /* Temporary file indicator */ 10 short token; /* Used for validity checking */ 11 } FILE; /* This is the FILE object */ FILE这个结构包含了文件操作的基本属性

C:指针基础

夙愿已清 提交于 2020-01-29 01:18:03
内存概述 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。 外存:外部存储器,长时间保存程序/数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。 内存是沟通CPU与硬盘的桥梁: 暂存放CPU中的运算数据 暂存与硬盘等外部存储器交换的数据 物理存储器和存储地址空间 有关内存的两个概念:物理存储器和存储地址空间。 物理存储器:实际存在的具体存储器芯片。 主板上装插的内存条 显示卡上的显示RAM芯片 各种适配卡上的RAM芯片和ROM芯片 存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。 编码:对每个物理存储单元(一个字节)分配一个号码 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写 内存地址 将内存抽象成一个很大的一维字符数组。 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。 这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址: char:占一个字节分配一个地址 int: 占四个字节分配四个地址 float、struct、函数、数组等 指针基础 指针和指针变量 内存区的每一个字节都有一个编号,这就是“地址”。

指针的指针笔记

流过昼夜 提交于 2020-01-28 20:12:32
指针在Wikipedia 上的定义 在計算機科學中,指標(英語:Pointer),是程式語言中的一類數據類型及其物件或變數,用來表示或儲存一個記憶體位址,這個位址的值直接指向(points to)存在該地址的對象的值。 如何理解 指针 是一个普通的变量或常量,但是它存储的是 另一个 变量或常量的地址; 指针的指针 和指针一样,它所存储的也是另一个变量或常量的地址,只不过那是个 指针变量或指针常量 ; 指针的指针的指针 等同样可以递归理解。 函数的指针 和指针唯一的不同是所存储的是一个函数的入口,正像 数组名指向数组的入口 ; 同样的, 什么的指针 ,就是指向什么; 二维数组 下面是一个定义示例: char a[10][100]; 很明显它定义了十个一维字符数组 a[0][100], a[1][100] ... a[9][100]。 运用一维数组的知识,我们可以很容易理解,a[0], a[1] ... a[9] 是十个指针常量,分别指向每个字符数组的首地址。 它们在内存中是这样的 那么 a 是啥,它指向了 a[0] 所在的存储空间,是指向指针的指针。 结构体指针 我们知道我们可以用 结构名.成员 来引用某个特定结构中的成员。 对于结构体指针,假设 p 是一个指向结构的指针,可以用以下两种方法引用结构中的成员: p->x; /* p -> 结构成员*/ (*p).x; /

最全面的C/C++编码规范总结

牧云@^-^@ 提交于 2020-01-28 20:02:33
C语言是面向过程的,而C++是面向对象的 对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性、可维护性。例如我们可以规定某个项目的C语言程序要遵循这样的规定:变量的命名,头文件的书写和#include 等等。 下面是一些广为采用的编码规范: GNU Coding Standards Guidelines for the Use of the C Language in Vehicle Based Software C++ Coding Guidelines SUN Code Conventions for Java 以下是一些介绍编码、编码规范的书籍: C++编码规范,陈世忠,人民邮电出版社,2002 高质量程序设计指南:C++/C语言,林锐等,电子工业出版社,2003 注:以下只是根据课题组已有的经验给出的总结,并非对所有场景均适用。 对于高质量的工程,一般会做到: 代码简洁精炼,美观,可读性好,高效率,高复用,可移植性好,高内聚,低耦合,没有冗余,不符合这些原则,必须特别说明。 规范性,代码有规可循。特殊排版、特殊语法、特殊指令,必须特别说明。 小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具

c语言指针初探

天大地大妈咪最大 提交于 2020-01-28 17:15:52
与c语言指针相关联的三个符号,一个是地址符&,一个是间接符号*,还有一个是在声明指针时用到的*符号。 那么什么是指针呢?指针时存储变量地址的变量,不是整型,它就像int,float一样是指针类型。 p = & i ; //p存储的是变量i在内存中的地址 i = * p ; //*符号加在指针p前,表示取的是这个地址上的变量值 printf ( "%p" , p ) ; //打印指针使用%p 例子:定义一个函数用于交换两个变量的值 # include <stdio.h> void interchange ( int , int ) ; int main ( void ) { int a = 5 ; int b = 3 ; printf ( "交换前a=%d,b=%d.\n" , a , b ) ; interchange ( a , b ) ; printf ( "交换后a=%d,b=%d.\n" , a , b ) ; return 0 ; } void interchange ( int a , int b ) { int temp ; temp = b ; b = a ; a = temp ; } 程序运行的结果 因为函数内的变量是局部变量,只存在于函数内部,函数interchange里的ab虽然交换了,但这里的ab和主函数的ab没有关联,它们在内存中的地址都不一样

【C语言进阶剖析】42、内存操作的经典问题分析(二)

梦想的初衷 提交于 2020-01-28 17:11:54
1 常见内存错误 结构体成员指针未初始化 结构体成员指针未分配足够的内存 内存分配成功,但未初始化 内存操作越界 我们记得定义一个指针的时候要初始化,却容易忘记定义结构体变量时初始化指针成员。指针未分配足够的内存会导致越界操作的问题。内存分配成功,但未初始化,这个可能回造成字符串方面的错误。内存操作越界可能会操作不因该操作的内存,比如字符串没有结尾的 ‘\0’,复制的时候没有发现结尾的 ‘\0’,导致越界了。第四条包括的 2,3 条。 2 找内存错误 下面我们来找找下面的程序中哪里出现了内存错误呢? // 42-1.c # include <stdio.h> # include <malloc.h> void test ( int * p , int size ) { int i = 0 ; for ( i = 0 ; i < size ; i ++ ) { printf ( "%d\n" , p [ i ] ) ; } free ( p ) ; } void func ( unsigned int size ) { int * p = ( int * ) malloc ( size * sizeof ( int ) ) ; int i = 0 ; if ( size % 2 != 0 ) { return ; } for ( i = 0 ; i < size ; i ++ ) {