c语言指针

28-指针的定义和初始化

拜拜、爱过 提交于 2020-01-04 05:47:36
本节知识点: 1、指针变量 2、定义一个指针变量 3、指针变量的引用 4、指针变量的初始化方法 5、使用*获取指针对应存储区域的内容 ---------------------------------------------------------------------------------------------------- 1、指针变量    在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。   因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 注意,严格意义上讲:    指针 是一个地址, 是一个常量。    指针变量 是存放一个地址, 是一个变量。 指针变量用于存放指针(地址)。 对比整型数据理解:int a = 10;   10 是一个整型数据, 是一个常量   整型变量a是存放整型数据的,是一个变量。 图中:变量i_pointer 就是一个指针变量,查看k = i + j; 的存储过程 2、定义一个指针变量 对指针变量的定义包括3个内容:   (1) 指针类型说明,即定义变量为一个指针变量   (2) 指针变量名   (3) 变量值(指针) 一般形式为: 类型说明符 *变量名 可以理解为 (类型说明符 *)变量名   其中, 这里的*只具有象征意义,仅表示这是一个指针变量 ,变量名即为定义的指针变量的名称

C语言中的强制类型转换

情到浓时终转凉″ 提交于 2020-01-04 05:38:37
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语言指针类型 强制转换

99封情书 提交于 2020-01-04 05:38:08
关于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**

c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?

ぐ巨炮叔叔 提交于 2020-01-03 17:28:41
目录 一、类对象的存储方式: 二、无论通过对象还是指针,能使用的方法只与它们静态类型有关。 三、 不同类型的指针有什么区别? 四、 指针与引用来实现多态 五、对象不能实现多态 引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以。 那为什么?让我们来解开这神秘的暗纱!转载自:https://www.cnblogs.com/yinheyi/p/10525543.html 一、类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量。 如果该类中存在虚函数的话,再多加一个指向虚函数列表指针—vptr。 例如声明如下两个类,并分别实例化两个对象,它们的内存分配大致如下:(vptr具体在什么位置,与编译器有关,大多数都在开始处) class base { public: virtual ~base() {}; virtual string GetName() { return "base"; } GetA(); int a; }; class derived : public base { public: virtual ~derived() {}; virtual string GetName() { return "derived";} GetB(); int b; }; base B1, B2; derived D1, D2; 内存分布大致如下:

C语言入门(7)——指针入门

依然范特西╮ 提交于 2020-01-01 04:44:46
C语言入门(7)——指针入门 1. 指针是什么? 指针是一种保存变量地址的变量。 在计算机中每个存储单元(一个字节)都有一个编号,这个编号称为变量地址。 普通变量的值是实际值,指针变量的值是变量的地址。 取地址 我们可以在变量名前加上 & ,表示获取变量的地址。 int n = 10 ; printf ( "&n=%p\n" , & n ) ; printf ( "n=%d\n" , n ) ; 变量地址通常使用16进制表示,使用 %p 或者 %P 打印地址。 试一试,多次执行上面的代码编译的可执行文件。 scanf() 实参前面的 & 符号. 2. 指针怎么用? 2.1 定义指针 定义指针与定义变量的方式一样,只不过要在类型和变量名中间加上一个 * 星号。 类型 * 指针变量 ; 指针变量只能使用 同类型变量的地址 赋值。 int n = 10 ; int * p ; p = & n ; printf ( "&n=%p\n" , p ) ; printf ( "n=%d\n" , n ) ; 也可以直接初始化。 int n = 10 ; int * p = & n ; printf ( "&n=%p\n" , p ) ; printf ( "n=%d\n" , n ) ; 试一下 int n = 0 ; int * p = & n ; scanf ( "%d" , p ) ;

C语言错题集

社会主义新天地 提交于 2019-12-31 02:10:20
一、选择题 (1).若有定义:int *p[4];则标识符p是()。 A: 是一个指向整型变量的指针 B: 是一个指针数组名 C: 是一个指针,它指向一个含有四个整型元素的一维数组 D: 定义不合法 标准答案:B, 解析:p是一个具有4个元素的指针数组,每一个元素是一个int型指针 (2).下面判断正确的是 ()。 A: char *a=“china”;等价于char *a; a=“china”; B: char str[10]={“china”};等价于char str[10];str[]={“china”}; C: char *s=”china”;等价于char *s; s=”china”; D: char c[4]=”abc”,d[4]=”abc”;等价于char c[4]=d[4]=”abc”; 标准答案:A, 解析:A:指针变量可以在定义时初始化(赋初值),也可以在定义之后再初始化。 B:字符串数组必须在定义的时候就初始化,否则就要从键盘上输入给它初始化。 C:指针变量只能存放地址,不是把字符串赋给s,只是把”china”的第一个字符的地址赋给指针变量s。在C语言中只有字符变量,没有字符串变量。所以应该是等价于char *s; s=”china”。 D:字符数组之间不可以直接互相这样赋值。 (3).若有说明:int i, j=2,*p=&i;, 则能完成i

错题集

夙愿已清 提交于 2019-12-30 01:07:11
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 A 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。5.对于以下结构定义,++p->str中的++加在 A。 (2分) struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

C语言,怎么学

被刻印的时光 ゝ 提交于 2019-12-30 01:01:12
本科就在学习C,但是不见得你学会了,过了二级也并不能说明任何问题。等你真正在工作里用到了,才能体会到自己的浅显,与现实需要之间的差距,太大! 程序的执行过程,链接装载与库,程序的内存布局,指针,堆,栈,数组与指针,逻辑语句的短路行为,芯片的大端模式与小端模式,还有常用的库函数,等等等等! 学习的最好方法就是用,就是练习!但是练习之前,你需要知道练习什么。接下来,我将分享这些!C语言的各种关键点。 基础知识请参考《》,这是我读过的最经典的书之一! 来源: CSDN 作者: chd_felix 链接: https://blog.csdn.net/chd_felix/article/details/103754798

错题题(已更正)

喜夏-厌秋 提交于 2019-12-29 21:30:29
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 A 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素。 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。 5.对于以下结构定义,++p->str中的++加在 A。 (2分) struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

C++ Primer 有感(异常处理)

心已入冬 提交于 2019-12-29 05:23:13
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型