指针变量

指针草稿

旧时模样 提交于 2020-03-03 17:29:40
指针 内存,以一个字节为单位来分配内存 每个字节的内存都有标号,这个标号就是指针 指针需要存储,32位的编译器用32位(4字节)存储此地址,64位的用64位的(8字节)存储此地址 编码:为每个物理存储单元(一个字节)分配一个号码 寻址:根据分配的号码找到相应的存储单元,完成数据读写 char:占一个字节,分配一个地址 int:占四个字节,分配四个地址 定义一个变量,在程序编译或运行时,系统给这个变量分配内存的单元,并且确定他的内存地址 指针是内存的单元的编号,指针变量是存放地址的变量;我们通常把指针变量和指针都叫做指针; int a = 10; int* p = &a; //取出a的地址,赋值给p printf("%p\n%p\n",p,&a); //%p是打印地址,以十六进制的方式 printf("结束"); //&a和p的值相同 int b = *p; printf("%d\n",b); //*p是访问p位置的值,这里打印出a的值10 *p = 200; printf("%d\n",b); //b的值是10 printf("%d\n",a); //a的值是200 int a =10;分配一个空间给a,a的地址编号是0X123456,把10存放到a的空间; int *p = &a;分配一个空间给p,把a的地址编号0x123456存放到p的空间; 野指针

函数指针

馋奶兔 提交于 2020-03-03 07:24:43
标题程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址 (也称“ 入口地址 ” )。 我们可以将函数的入口地址赋给一个指针变量 ,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。 定义形式 类型名 (* 指针变量名)(参数类型1, 参数类型2,…); 例如: int (*pf)(int ,char); 使用方法 用一个原型匹配的函数的名字给一个函数指针赋值。 通过函数指针可以调用它所指向的函数,写法为: 函数指针名(实参表); 举例 1: # include <iostream> # include <cstring> using namespace std ; void PrintMin ( int a , int b ) { if ( a < b ) printf ( "%d" , a ) ; else printf ( "%d" , b ) ; } int main ( ) { void ( * pf ) ( int , int ) ; int x = 4 , y = 5 ; pf = PrintMin ; pf ( x , y ) ; return 0 ; } 举例 2: 类似 qsort库函数: void qsort (void *base, int nelem, unsigned

c语言 关键字之typedef 详解

本秂侑毒 提交于 2020-03-03 06:34:01
 在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。   那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明: (1)基本数据类型定义   有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下:   typedef unsigned char uint8_t; //无符号8位数   typedef signed char int8_t; //有符号8位数   typedef unsigned int uint16_t; //无符号16位数   typedef signed int int16_t; //有符号16位数   typedef unsigned long uint32_t; //无符号32位数   typedef signed long int32_t; //有符号32位数   很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时

第三十天

寵の児 提交于 2020-03-03 02:22:20
f返回的值是指针 格式 类型名 *函数名(参数表列); 例如 指针函数是指带指针的函数,就是函数 函数指针是指指向函数的指针,因此这个是指针变量 一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量,一维指针数组的定义形式为 类型名 数组名[数组长度]; 例如 int *name[4]; int i; 定义整形变量i; int *p; p为指向整形数据的指针变量 int a[n]; 定义整形数组a,他有n个元素 int *p[n]; 定义指针数组p,它由n个指向整形数据的指针元素组成 int (*p)[n]; p为指向含你个元素的一维数组的指针变量 int f(); f为带回整形函数值得函数 int *p(); p为带回一个指针的函数,该指针指向执行数据 int **p; p是一个指针变量,它指向一个指向整形数据的指针变量 指针变量可以有空值 p=null; 指针变量可以相减 如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数 若;两个指针指向同一个数组的元素,则可以进行比较,指向前面的元素的指针变量“小于”指向后面元素的指针变量 void作用 对函数返回的限定 对函数参数的限定 例如void abc(void) 还可以加一种void指针:不指定它是指向哪一种类型数据的指针变量 仅仅是存地址

普天C++笔试题

痞子三分冷 提交于 2020-03-02 16:43:51
1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数; 答: //假设线性表的双向链表存储结构 typedef struct DulNode{ struct DulNode *prior; //前驱指针 ElemType data; //数据 struct DulNode *next; //后继指针 }DulNode,*DuLinkList; //删除操作 Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e) { if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现 return ERROR; e=p->data; p->prior->next=p->next; p->next->prior=p->pror; free(p); return OK; } //插入操作 Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e) { if(!(p=GetElemP_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; s->prior=p->prior; p-

C++ const关键字

冷暖自知 提交于 2020-03-02 07:47:16
文章目录 基本用法 const与指针 const与引用 const 写在函数体{}前 基本用法 const用来声明一个常量,常量被初始化后它的值就固定了,不再允许修改: const int Month = 12 ; const与指针 const用于指针有三种形式: 让指针指向一个常量对象,防止指针修改所指向的值,例如: int age = 39 ; const int * pt = & age ; //声明指向常量的指针 上面的代码声明了一个指向 const int 类型的变量,因此不能用pt来修改该值,即*pt的值为const,不能被修改。 不能使用pt来修改age的值,但是可以直接修改age的值,因为age是常规变量,没有const修饰: * pt = 20 ; //错误 age = 20 ; //正确 对应const 修饰的变量来说只能赋值给“指向常量的指针”,不能赋值给常规指针: const float g_earth = 9.8 ; const float * pe = & g_earth ; //正确 float * pt = & g_earth ; //错误 声明指针本身为常量,防止改变指针所指向的位置 、 int sloth = 3 ; int * const finger = & sloth ; 上面的声明中finger只能指向sloth

C语言学习笔记<八>

别来无恙 提交于 2020-03-02 06:40:14
通过使用联合可以用不同的方式操作内存中同一段区域。 计算机中存储数据的方式有两种,把低位数据存储在低地址字节中的方式叫做小端存储方式,相反就叫大端存储方式,我们的计算机采用的是小端存储方式。 使用枚举类型可以把一组名称转换成整数,从数字0开始。 堆里的变量的生命周期是由程序员来管理的, 可以使唤用C语言提供的函数对堆中的变量进行管理,为了使用这些函数需要包含头文件stdlib.h。 malloc函数可以从堆中分配指定个数的连续字节把首字节地址返回。如果失败则返回NULL . free 函数可以把堆中的变量释放掉,需要首字节地址作为参数。 calloc 函数也可以从堆中分配变量,并且保证把变量都清0. realoc 函数可以调整一段已经分配好的内存空间的大小。如果失败返回空地址。特殊情况下操作效果类似于malloc 或free.0 const 指针有两种声明方法 const int *p_value; int * const p_value; 前一种指针表示的整数变量不可以被修改 后一种指针表示的指针变量本身不可以被修改。 二级指针变量用来记录一级指针变理的地址,声明方法如下 int **pp_value; 二级指针变理可以用来表示它自己和对应的一级指示变量以及整数变量,使用方法如下 pp_value 表示二级指针 *pp_value 表示对应的一级指针。 **pp_value

指针知识(三):指针与数组

半城伤御伤魂 提交于 2020-03-02 06:17:56
数组的概念与指针的概念联系非常解密。其实 数组的标识 相当于它的 第一个元素的地址 ,如:int a[5],数组名a指向它的第一个元素a[0]的地址。 有语句如下: int a[5]; int * p; 下面的赋值为合法的: p = a; 这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是: a = p; 因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。 由于变量的特性,以下例子中所有包含指针的表达式都是合法的: #include <iostream> using namespace std; int main() { int a[5]; int *p; p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0], *p = 10;    //即a[0]=10 p++; *p = 20;   //a[1]=20 p = &a[2]; *p = 30;   //a[2]=30; p = a +3; *p = 40;    //a[3]=40 p = a; *(p+4) = 50; //a[4]=50

C语言文件操作详解

限于喜欢 提交于 2020-03-02 04:13:23
C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志               ftell 了解文件指针的当前位置       文件定位函数 rewind 反绕              

C++复习知识点总结(二)

独自空忆成欢 提交于 2020-03-02 01:15:28
一:C++多态与虚函数 1:基类的指针也可以指向派生类对象 People *p = new People(“王志刚”, 23) p = new Teacher(“赵宏佳”, 45, 8200);//指向派生类对象 调用函数时会出错(people的函数中没有第三项,及8200的数据),即当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数 基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。即:virtual 类型 函数名 对于派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。 2:虚函数注意事项及条件 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。 基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();