指针变量

01 程序的编译执行、变量、static和const关键字、循环的转换、指针与数组

孤人 提交于 2020-02-10 16:41:35
初学者的探索之路01 1.代码编译的几个阶段 2.程序的执行 1>程序和进程的区别: 2>内存的四个区域 3.变量的分类以及特性 4.static关键字的影响 5.const的用处(L) 6.for循环和while循环以及do-while循环之间的转换关系(L) 7.指针的分类以及特性 8.数组与指针的结合(L) 9.代码的合法性和完整性(时间与空间的平衡)(L) 附:rand()函数和srand()函数的用法 1.代码编译的几个阶段 .c .cpp 源文件 .i 预处理文件 .o(linux操作系统下) .obj(windows操作系统下) 目标文件 .exe 可执行文件 分为三个阶段:预编译、编译、链接过程 所有的#都是在预编译过程中展开的 2.程序的执行 1>程序和进程的区别: 程序执行后会进入进程。 程序是静态的,进程是动态的。 程序在运行的时候会耗损时间(cpu)和空间资源(内存)。 2>内存的四个区域 .code 代码段 .data 数据区 .heap 堆区 .stack 栈区 两个凡是 :1.凡是在函数外部定义的变量叫做全局变量 ,存储在数据区。 2.凡是在函数内部定义的变量叫做局部变量,存储在栈区。 3.变量的分类以及特性 变量可以分为 :全局变量、在函数内定义的局部变量、在块内定义的局部变量。 变量的两个特性 :可见性和生存期 可见性 :针对编译链接过程来谈论的

About 指针

给你一囗甜甜゛ 提交于 2020-02-10 13:03:20
一. 地址指向该变量单元,地址形象化地称为“指针”. 如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”。 指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。 二. 定义指针变量定义 类型名 *指针变量名 如: int *pointer-1; 左端的int是定义指针变量时 必须指定的“基类型” ,指针变量的基类型用来指定 此指针变量可以指向的变量的类型。 (基本的数据类型如:int,char,float等) pointer-1是指所存的地址 *pointer-1指向存储的地址指的数据 来源: CSDN 作者: weixin_45732699 链接: https://blog.csdn.net/weixin_45732699/article/details/104245730

C++ typedef用法小结 (※不能不看※)

[亡魂溺海] 提交于 2020-02-10 11:19:32
C++ typedef用法小结 (※不能不看※) 第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如: struct tagPOINT1 { int x; int y; }; struct tagPOINT1 p1; 而在C++中,则可以直接写:结构名 对象名,即:tagPOINT1 p1; 估计某人觉得经常多写一个struct太麻烦了,于是就发明了: typedef struct tagPOINT { int x; int y; }POINT; POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候 或许

c 常见错误

家住魔仙堡 提交于 2020-02-10 07:48:50
."c" not an argument in function sum 该标识符不是函数的参数 2.array bounds missing ] in function main 缺少数组界限符 "]" 3.Array size too large in function main 数组规模太大 4.bad file name format in include directive 在包含指令中的文件名格式不正确. 5.Call of non-function in function main 调用未经过定义的函数. 6.cannot modify a const object in function main 对常量不能进行修改. 7.character constant too long in function main 字符常量太大 8.constant expression required in funtion main 数组定义的时候,数组大小要求是常数 9.compound statment missing } in function main 复合语句漏掉符号 "{" 10.declaration syntax error in function main 宣告语法错误 11.expression syntax in function main 表达式语法错误

为何不精通C? 04 辨析数组与指针

点点圈 提交于 2020-02-10 04:42:59
前言 学习C语言,指针绝对是一道大坎,很多人谈指针色变,使用起来小心翼翼的。“一切指针都是纸老虎” ,同时,对我们得“在战略上藐视指针,战术上重视指针”。 本文先 剖析 下 一维数组和指针 ,多维的情况后序博客继续更新。 文章流程: 1、辨析指针和数组的不同 2、辨析它们相同的时刻 3、总结 指针和数组为什么这么纠缠不清 首先说一点,指针的使用等同于数组的情况远远多于他们不同的情况,因此,在初学时,为了容易理解,很多人都 说 “指针=数组” 。 但是,这却 是错误 的! 来个例子吧: // file1.c 定义一个数组array int array[100];以上是在文件1中的定义 // file2.c 声明file1.c中的array extern int* array以上是在文件2中的声明 上面的例子对不对呢? 大家可以自己测试下,会很神奇的发现: 咔,怎么编译出 错 啦! 为什么 呢? 继续深入声明和定义 在辨析数组和指针前,首先要说下声明和定义的区别,之前博文“为何不精通C? 03 深入剖析声明” 中的末尾已经提过这一点了。这里重新说下: C语言中,对象 有且仅有一个定义 ,而声明却可以有 多个extern 声明 。 定义:只能出现在一个地方,确定同时分配内存,它是特殊的声明 声明:只是 描述 其他地方创建对象的 属性 。有extern前缀,作用于变量 对于 声明

C语言学习笔记--指针和数组的关系

懵懂的女人 提交于 2020-02-10 04:14:09
1. 数组的本质 ( 1 )数组是一段 连续的 内存空间 ( 2 )数组的空间大小: sizeof(array_type)*array_size; ( 3 )数组名可看做 指向数组第一个元素 的常量指针 (4 )数组声明时编译器自动分配 一片连续的内存空间 ,而 指针声明时只分配了用于容纳地址值的 4 字节 空间 2. 指针的运算 ( 1 )指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时, p+1 指向当前元素的下一个元素, p-1 指向 上一个元素。 ( 2 )指针之间 只支持减法 运算且参与减法运算的指针 类型必须相同 。 p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type) ① 只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元 素的下标差。 ② 当两个指针指向的元素不在同一个数组中时,结果未定义。 指针运算的应用 #include <stdio.h> //统计元素的个数 #define DIM(a) (sizeof(a) / sizeof(*a)) int main() { char s[]={'H','e','l','l','o'};//栈 char*

C语言-再论指针与数组

末鹿安然 提交于 2020-02-10 04:10:34
指针与数组的天生姻缘 1、以指针方式来访问数组元素 (1)、数组元素使用时不能整体访问,只能是单个访问。访问形式有两种:数组形式和指针形式。 (2)、数组形式访问数组元素:数组名[下标];(下标从0开始 (3)、指针格式访问数组元素:*(指针+偏移量); (4)、数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的。在编译器内部都是用指针方式来访问数组的, 数组下标方式只是编译器给编程者提供了一种壳而已。所以用指针方式来访问数组才是本质的做法。 2、从内存角度理解指针访问数组的实质 (1)、数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点就是数组中各个元素的类型 比较相同。类型相同就决定了每个数组元素占几个字节是相同的。 (2)、数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。 这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。 3、指针与数组类型的匹配问题 (1)、int *p; int a[5]; p = a; //类型匹配,a做右值等同于&a[0]; (2)、int *p; int a[5]; p = &a; //类型不匹配,p是int *,&a是整个数组的指针,也就是一个数组指针类型,不是 int指针类型,所以不匹配。 (3)、&a、a、&a[0]从数值上看是完全相等的,但是从意义上看就不同了

【知其所以然】语义\"陷阱\"---数组和指针

佐手、 提交于 2020-02-10 03:29:33
数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过? 这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别 、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。 为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过 What's a Declaration? What's a Definition? 声明和定义 c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。 A definition is the special kind of declaration that creates an object; a declaration indicates a name that allows you to refer to an object created here or elsewhere。 定义是一种特殊的声明、它创建了一个对象;声明简单的说明了在其他地方创建的对象的名字,它允许你使用这个名字。 可以简单的这样理解: 声明 Declaration :描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方) 定义 Definition :产生一个新的对象,并分配内存。(只能出现一次) How Arrays and

C++对象数组与对象指针

拈花ヽ惹草 提交于 2020-02-10 03:22:06
(一)对象数组   将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为:   类名 对象数组名[];   Point points[100];   关于对象数组的几点说明:   (1)在建立对象数组的时候需要调用构造函数。如果对象数组有100个元素,就需要调用100次构造函数。   (2)如果对象数组所属类有带参数的构造函数时,可用初始化列表按顺序调用构造函数,使用复制初始化来初始化每个数组元素。   Point A[3]={Point(0,0),Point(1,1),Point(2,2)}; //Point(int a=0,int b=0)   Point A[3]={Point(1),Point(2),Point(3)}; //Point(int a=0,int b=0)   (3)如果对象数组所属类有单个参数的构造函数时候,定义数组时可以直接在初值列表中提供实参。   Point A[3] ={1,2,3}; //Point(int a=0,int b=0)   等价与:   Point A[3]={Point(1),Point(2),Point(3)};   (4)如果对象数组在创建时没有初始化,则所属类要么有合成默认构造函数,要么定义无参数的构造函数或全部参数为默认参数的构造函数。   (5

const常量定义数组大小

邮差的信 提交于 2020-02-10 03:16:16
结果是不能编译通过,如下 大致意思是常量size2是用变量temp定义的,所以size2的值是不固定的,不固定的值当然是不能够用来定义数组的,因为编译器在编译的时候就需要知道给数组分配多大空间,而变量的值在运行时有可能变化。 将char str2[size2]这句去掉是可以编译通过的,这说明const常量是可以通过变量初始化的。只是在初始化之后就不可以再修改了。 这些规则其实都是编译器行为。 这个题让我想起了const与数据,指针的组合。 (1)常量数据: const int n, int const n (2)常量指针: int * const p (3)指向常量数据的指针: const int * p, int const * p (4)指向常量数据的常量指针: const int * const p, int const * const p 看的让人眼花缭乱,其实很好记, 在有*和const的情况下,先看*和const的位置,只有const在*之后,这个const修饰的才是指针,在*之前,这个const修饰的都是数据。所以常量指针只有一种表示(* const) 而在没有*和有*但const在*之前的情况下,const修饰的都是数据,所以(const *)这种情况修饰的一定是数据,而数据int与const的位置又有2种,int const,和const int。