c语言指针

深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别

橙三吉。 提交于 2019-11-28 06:05:02
转自:https://blog.csdn.net/liusicheng2008_liu/article/details/80412586 1 数组的本质    数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。。 2 指针。    指针也是一种变量,只不过它的内存单元中保存的是一个标识其他位置的地址。。由于地址也是整数,在32位平台下,指针默认为32位。。 3 指针的指向?    指向的直接意思就是指针变量所保存的其他的地址单元中所存放的数据类型。    int * p ;//p 变量保存的地址所在内存单元中的数据类型为整型 float *q;// ........................................浮点型 不论指向的数据类型为那种,指针变量其本身永远为整型,因为它保存的地址。 4 字符数组。。。 字面意思是数组,数组中的元素是字符。。确实,这就是它的本质意义。 char str[10]; 定义了一个有十个元素的数组,元素类型为字符。 C语言中定义一个变量时可以初始化。 char str[10] = {"hello world"}; 当编译器遇到这句时,会把str数组中从第一个元素把hello world\0 逐个填入。。 由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的

转 C++面试题

我怕爱的太早我们不能终老 提交于 2019-11-28 05:18:51
1.static有什么用途?(请至少说明两种) 1)函数体内,声明为static的变量,在函数调用中其值不变。 2) 在同一个文件内(但在函数体外),声明为静态的变量,可被本文件内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用( &)与指针(*)有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 4) 引用没有 const,指针有 const,const 的指针不可变; 附:int &ra=a; //引用ra,是变量a的引用,即别名 & 在此不是求地址运算,而是起标识作用。 声明引用,必须同时对其初始化。 引用声明完,相当于变量有两个名称。 引用本身不占有存储单元 不能建立引用的引用,指向指针的引用(int && n ; int &*p 为错误的 int *&q;正确) 3.描述实时系统的基本特性 时间约束性 可预测性 可靠性 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库 局部变量在堆栈。 局部变量会屏蔽全局变量 全局变量运行时会更快(不用再分配空间) 5.什么是平衡二叉树?

多态

我的未来我决定 提交于 2019-11-28 01:43:20
多态主要用于父类虚函数传递给子类 子类利用虚函数对父类的重写 这样父类就可以通过指针对子类的虚函数进行调用 父类不可以通过指针直接调用子类中的方法,需要子类利用虚函数调用子类中的成员变量或者函数才能对调用 这里引入了静态联编和动态联编 静态联编:在运行前 就知道运行什么函数 调用熟读比较快 但是不灵活c语言中经常运用 动态联编:利用指针找到虚函数 调用的时候才知道用那个函数 比较灵活 但是调用速度比较慢 拥有虚函数的对象中会有一个虚指针 这个指针指向虚函数表(存放虚函数的地址) 子类重写父类虚函数 区修改表中的地址 虚基类 为了重写虚函数 父类总虚函数可以不实现 纯虚函数就是在父类的虚函数中写=0 不写函数体 不能调用 virtual fun()=0; 拥有纯虚函数的类 虚基类/抽象类 没法定义对象 但是可以定义指针或者引用 可以派生新的类 子类纯虚数即可定义对象 在类中书写完整的数据+功能 参数只有一个传递对象的地址 不同对象传递不同的地址 传入内容 对象中的数据 若干成员个数 具体功能实现如下代码 多态.cpp 1 #include<iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 void fun(){ 7 cout << "父类的fun函数" << endl; 8 } 9 virtual void fun2

code与const void*指针

柔情痞子 提交于 2019-11-28 01:07:04
关于指针: 当定义int *p时,它也会在内存中给指针变量p分配一个内存单元,假设这个单元在内存的编址为0x1003;此时,0x1003中的值是不确定的,(因为我们没有给指针赋值),当编译器遇到了p=&a时,就会在0x1003单元中保存一个地址(变量a在内存中分配的地址) 空指针 :不指向任何单元,仿真野指针。在 stdio.h中 被定义为 #define NULL ((void *)0)#define NUL ’\0 NULL 使 p 指向地址 0。大多数系统中都将 0 作为不被使用的地址,所以吴用 p 也不会毁坏数据但并非总是如此,也有系统会使用地址 0,而将 NULL 定义为其他值,所以不要把 NULL 和 0 等同起来因为PC上有NULL的定义所以可以直接拿来使用,但是在单片机中,就没有NULL了。而且也不能简单将NULL自定义为0,因为0地址处是有用的,那么此时该怎么办呢?空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。在函数调用时对所有的空指针进行类型转换可能是预防可变参数和无原型函数出问题的最安全的办法注意 NULL 和 NUL 的区别:NULL表示空指针,是一个宏定义,可以在代码中直接使用。而 NUL 表示字符 '\0',也就是字符串结束标志,它是ASCII码表中的第 0 个字符。NUL 没有在C语言中定义

iOS开发系列--C语言之指针

笑着哭i 提交于 2019-11-28 01:04:06
概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 数组和指针 函数指针 什么是指针 存放变量地址的变量我们称之为“指针变量”,简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a。当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为“直接引用”;而当我们通过p取得a的时候首先要先根据p转换成p对应的存储地址,再根据这个地址到其对应的存储空间中拿到存储内容,它的内容其实就是a的地址,然后根据这个地址到对应的存储空间中取得对应的内容,这个内容就是a的值,这种通过p找到a对应地址再取值的方式成为“间接引用”。这里以表格形式列出a和p的存储以帮助大家理解上面说的内容: 接下来,看一下指针的赋值 // // main.c // Point // // Created by Kenshin Cui on 14-7-05. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #include <stdio.h> int main(int argc, const char * argv[])

C语言程序设计(十二)

浪子不回头ぞ 提交于 2019-11-27 23:57:50
第十二章 结构体和共用体 当需要表示复杂对象时,仅使用几个基本数据类型显然是不够的 根本的解决方法是允许用户 自定义数据类型 构造数据类型(复合数据类型)允许用户根据实际需要利用已有的基本数据类型来构造自己所需的数据类型 它们是由基本数据类型派生而来的,用于表示链表、树、堆栈等复杂的数据对象 抽象数据类型不再单纯是一组值的集合,还包括作用在值集上的操作的集合 即在构造数据类型的基础上增加了对数据的操作,且类型的表示细节和操作的实现细节是对外不可见的 结构体类型数据存储的优点: 结构紧凑,易于管理 局部数据的相关性强,便于查找 赋值时只针对某个具体的对象,局部的输入错误不会影响全局 结构体:对关系紧密、逻辑相关、具有相同或者不同属性的数据进行处理 共用体:数据成员的情形是互斥的,每一时刻只有一个数据成员起作用 结构体模板的定义格式: struct 结构体名 { 数据类型 成员1的名字; 数据类型 成员2的名字; …… 数据类型 成员n的名字; }; 结构体的名字,称为结构体标签 构成结构体的变量,称为结构体成员 结构体模板只是声明了一种数据类型,定义了数据的组织形式,并未声明结构体类型的变量 typedef定义数据类型: typedef用于为系统固有的或程序员自定义的数据类型定义一个别名 typedef int INTEGER; typedef struct student

指针数组和数组指针

陌路散爱 提交于 2019-11-27 23:39:37
指针数组和数组指针 1、字面意思来理解指针数组和数组指针 (1)、指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。 (2)、数组指针的实质是一个指针,这个指针指向的是一个数组。 2、分析指针数组和数组指针的表达式 (1)、int *p[5]; int(*p)[5]; int *(p[5]); (2)、一般规律:int *p(p是一个指针); int p[5];(p是一个数组) 总结:我们在定义一个符号时,关键在于:首先搞清楚你定义的符号是谁(第一步:找核心);其次再来看谁跟核心最近、 谁跟核心结合(第二步,找结合);以后继续往外扩展(第三步:继续向外结合直到整个符号完成)。 (3)、如果核心和*结合,表示核心是指针;如果核心和[]结合,表示核心是数组;如果核心和()结合,表示核心是函数; (4)、用一般规律来分析上述三个表达式: 第一个:int *p[5]; 找核心:p;其次[]比*的优先级要高,所以p先和[]结合,所以p是一个数组;然后再和*结合,表示是一个指针数组; 而且数组中存储的全部是int类型的指针变量。 第二个:int (*p)[5]; 找核心:p;因为有(),所以p先和*结合,表示p是一个指针,然后和[]结合,所以是一个指针数组,数组中的元素全部 是int类型。 第三个:int *(p[5]); 这个和第一个一样,()可有可无。 总结1

c语言学习笔记-指针

别等时光非礼了梦想. 提交于 2019-11-27 21:47:10
以下内容均为看郝斌老师视频和教学大纲,总结,复制粘贴而来的笔记。 指针的分类 1.基本类型指针 int * p //p是变量的名字,int*表示p变量存放的是int类型变量的地址 int *p int i = 5 p =&i //* p 等价于i //* p 表示以p的内容为地址的变量 2.指针和数组 指针和一维数组   一维数组名     一维数组名是个指针变量,它存放的是一维数组第一个元素的地址   下标和指针的关系     假设指针变量p     则 p[i]等价于*(p+i)    确定一个一维数组需要两个参数     1.数组第一个元素的地址     2.数组的长度    指针变量的运算     指针变量不能相加,不能相乘,也不能相除     如果两个指针变量指向的是同一块连续空间中的不同存储单元     则这两个指针变量才可以相减     sizeof变量的使用     sizeof(变量名)     功能:返回值是该变量所占的字节数     一个变量的地址是用该变量首字节的地址来表示的 3.指针和函数 4.指针和结构体 5.多级指针 示例: int i = 10; int * p=&i; int ** q=&p; int ***r=&q 来源: https://www.cnblogs.com/renren-study-notes/p/11378946.html

【C语言学习笔记】指针

我与影子孤独终老i 提交于 2019-11-27 21:45:49
用来存放一个变量地址的变量就叫指针变量。指针变量也是有类型约束的,一般什么类型的指针指向什么类型的变量。 指针之所以叫变量,是因为它里面所存放的变量的地址也是不断变化的,指针是可以移动的。 定义格式: 类型名 *指针变量名 eg:int *pi; 指针的作用都是一样的,都是用来存放地址的,为什么还要区分类型,因为指针变量只能存放特定定义类型的变量。 让指针存放一个变量的地址: pi=&a; &叫取址符,*叫指针运算符。 还有一种能存放指针变量地址的对象,他就是指向指针的指针。eg:int **p ; p=&s 给指针变量赋值: 1、通过求地址运算符(&)获得地址值 int k=1,*q,*p; 赋值语句为:q=&k;则把k的地址赋予了q,可以说变量q指向了变量k 注意:1、&只能用于变量和数组,不可以用于表达式、常量和被说明为register的变量,因此:q=&k+1 q=&(k+1)都是错误的。 2、&必须放在运算对象的左边,而且运算对象的类型必须与指针变量的类型相同。 2、通过指针变量获得地址值 可以通过赋值运算,把一个指针变量中的地址赋予另一个指针变量,从而使这两个指针指向同一个地址。 int k,*q,*p; q=&k ;p=q; 也就是说指针变量q和p都指向了变量k. 注意:当进行赋值运算时,赋值号两边的指针变量的基类型必须相同。 3、给指针变量赋空值

C++中的C

雨燕双飞 提交于 2019-11-27 20:24:08
前言 因为C++是以C为基础的,所以要用C++编程就必须熟悉C的语法。 C语言的学习可以学习K & R C的《C程序设计语言》 创建函数 Q: 函数原型? A: 标准C/C++有一个特征叫函数原型(function prototyping)。调用函数时,编译器使用原型确保正确传递参数并且正确处理返回值,如果调用函数时程序员出错,编译器就会捕获这个错误。 A: 下面是一个声明函数原型的例子: int translate(float x, float y, float z); 在函数原型中声明变量时,对于同样形式的变量,不能写成 translate(float x, y, z) 这种形式,而必须指明每一个参数的类型。在函数声明中,下面的形式是可以接受的: int translate(float, float, float); 因为在调用函数时,编译器只会检查类型,所以使用标识符只是为了使别人阅读代码时更加清晰。 Q: 空参和可变参数列表? A: 如果有一个空的参数列表,可以在C++中声明这个函数为func(),它告诉编译器,这里有0个参数。应该意识到这只意味着C++中是空参数列表,在C中它意味着不确定的参数数目,这是C语言中的漏洞,因为在这种情况下不能进行类型检查。 A: 在C/C++中,声明func(void)都意味着空的参数列表。 A: 可变的参数列表(variable