指针变量

C,C++——指针和数组

人走茶凉 提交于 2020-01-01 18:50:42
一 指针和一维数组的关系 指向数组的指针变量称为数组指针变量 数组名是数组首个元素的地址。 数组名可以看作是一个指针常量,不可修 改。 其值为首个元素的地址值。如下用指针变量访问数组元素 int a[]={12,22,32,42,52,62,72,82,92,102}; int *pa=a; //指针变量p指向数组a的首地址 。pa等价于a 用指针变量对数组元素的访问可以采用下标形式和指针形式两种 下标形式: p[i] 指针形式: *(p+i) 举例 for ( int i = 0 ; i < 5 ; i ++ ) { //使用数组方式 cout << p1 [ i ] << " " ; cout << b [ i ] << " " ; //使用指针运算符 cout << * ( p1 + i ) << " " ; cout << * ( b + 1 ) << " " ; } 二 指针和多维数组关系 C++允许把一个二维数组分解为多个一维数组来处理。数组名是首个元素 (一维数组)的地址。如下所示定义一个二维数组a int a [ 3 ] [ 4 ] = { { 11 , 12 , 13 , 14 } , { 21 , 32 , 23 , 24 } , { 31 , 32 , 33 , 34 } , } 二维数组a可以分解为一维数组a[0],a[1],a[2]。如下图所示 数组指针

单继承、多继承、菱形继承的虚函数表

自古美人都是妖i 提交于 2020-01-01 13:06:49
文章目录 前言 问题 测试环境 开始测试 无虚函数简单类结构 包含虚函数的类结构 单继承 多继承 菱形继承 虚继承 总结 前言 最近被问到一个关于多继承虚函数表的问题,当时回答是可能存在多个虚函数表,应该是顺序排列的,但具体怎么排列还是有些疑惑的,回答的时候到有点儿心虚。之后查了资料,做了简单的实验,可以确定的是对于继承了多个含有虚函数基类的子类来说,指向虚函数表的指针应该不止一个。 问题 虚函数表的问题是从C++多态的概念引出的,要想实现多态有3个条件: 存在继承:没有继承就没有多态(运行时),在多态中必须存在有继承关系的父类和子类。 重写函数:父类中需要定义带有 virtual 关键字的函数,而在子类中重写一个名字和参数与父类中定义完全相同的函数。 向上转型:将父类的指针和引用指向子类的对象。 满足以上三个条件,当使用父类的指针调用带有 virtual 关键字的函数时,就会产生多态行为。 实现这种多态表现的核心内容就是虚函数表,对于带有 virtual 关键字的函数地址会被放入一个表格,而在类中会有一个指向虚函数表的指针指向这个表格,表明这个表格属于类的一部分。 对于父类来说,这个表格中都是自己类的虚函数,而对于子类来说,首先这个虚函数表包含父类中所有的虚函数,当子类重写某个虚函数时就会用子类重写后的函数地址替换原来父类中定义的函数地址

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 ) ;

Golang源码探索(二) 协程的实现原理

左心房为你撑大大i 提交于 2019-12-31 22:04:19
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是 G , M 和 P , 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用 go 关键词创建. 举例来说, func main() { go other() } , 这段代码创建了两个goroutine, 一个是main, 另一个是other, 注意main本身也是一个goroutine. goroutine的新建, 休眠, 恢复, 停止都受到go运行时的管理. goroutine执行异步操作时会进入休眠状态, 待操作完成后再恢复, 无需占用系统线程,

函数指针做形参

最后都变了- 提交于 2019-12-31 12:40:15
cpp] view plain copy print? #include <stdio.h> void func(int* p) { printf("*p = %d/n", *p); printf("&p = %p/n", &p); } int main(int argc, char *argv[]) { int *a = new int(10); printf("*a = %d/n", *a); printf("&a = %p/n", &a); func(a); return 0; } 编译:g++ -g -Wall test1.cpp 运行:./a.out 输出: *a = 10 &a = 0xbfd4447c *p = 10 &p = 0xbfd44460 我们看到输出,a 指向的地址的值和p 指向的地址里的值是一样的,都是10 。然而,对于指针a 和p 来说,它们自身的地址是不一样的,所以我们看到,函数func 复制了指针a 给p ,它们的值一样,但有不同的地址,是不同的指针。 我们再进一步: [cpp] view plain copy print? #include <stdio.h> void func(int* p) { printf("*p = %d/n", *p); printf("&p = %p/n", &p); printf("&*p = %p/n", &*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

26,27删除数组重复项

回眸只為那壹抹淺笑 提交于 2019-12-30 00:11:24
目录 26,27删除数组重复项 题目 双指针法 题26解法 题27解法一 题27解法二 26,27删除数组重复项 题目 题目26 给定一个排序数组,你需要在 原地删除 重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 题目27 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 刚开始看完题目,不知道应该怎样去解决,为什么不创建新数组就可以“原地”删除元素,在参看力扣优秀解法之后,其实只要返回的新长度的范围内符合即可。 双指针法 题26解法 首先题目是 已经排序后 的数组,在不考虑数组中超出新长度后面的元素的前提下

错题题(已更正)

喜夏-厌秋 提交于 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】函数指针数组

谁说胖子不能爱 提交于 2019-12-29 13:11:54
部分转自: https://www.cnblogs.com/zmm1996/p/11752882.html 1.函数指针的概念 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。 函数指针的定义方式为: 函数返回值类型 (* 指针变量名) (函数参数列表); 例如下面语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。 int(*p)(int, int); 2.函数指针用法 demo1: # include <stdio.h> int Max(int, int); //函数声明 int main(void) { int(*p)(int, int); //定义一个函数指针 int a, b, c; p = Max; /