指针变量

C语言关键字const应用解析

被刻印的时光 ゝ 提交于 2020-01-12 14:46:06
只要学过C语言的,都有知道const这个关键字,知道是用来定义常量的,如果一个变量被const修饰,那么它的值就不能再被改变,那么还有什么其他作用呢? 一、const常用作用 1.修饰局部变量 const int n=5; int const n=5;/*二者是等价的,均表示变量n的值不能被改变了*/ 注意:在使用const修饰变量时,一定要给变量初始化,否则之后就不能赋值了! 接下来看看const用于修饰常量静态字符串,例如: const char * str = "fdsafdsa" ; 如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。 2. 常量指针与指针常量 常量指针 是指针指向的内容是常量,可以有一下两种定义方式。 const int * n ; int const * n ; 需要注意的是一下两点: 1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。 int a=5; const int* n=&a; a=6; 2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。 int a=5;

2019年春季学期第六周作业

淺唱寂寞╮ 提交于 2020-01-12 14:27:54
A Q 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 2019春第六周作业 我在这个课程的目标是 尽可能了解并且应用指针及文件和数组的知识 这个作业在那个具体方面帮助我实现目标 大致掌握了数组的简单编程及应用,了了解了文件和指针的基础知识和简单应用 参考文献 C语言chap11 和 C语言chap10 一、本周完成的作业 题目1. 6-1 求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。** 函数定义接口 double fun (double *a, double *b); 其中 a 和 b 是用户传入的参数。函数求 a 指针和 b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: include<stdio.h> include <math.h> double fun (double *a, double b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } / 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1).实验代码 double fun (double *a,

利用函数指针绕过断点

。_饼干妹妹 提交于 2020-01-12 11:47:06
#include<windows.h> int main() { MessageBox(0,0,0,0); //77D5085C int (__stdcall *pFun)(int,int,int,int,int);//定义函数指针类型的变量 pFun = (int (__stdcall *)(int,int,int,int,int))0x77D5085C;//给函数指针赋值 pFun(0,0,0,0,0);//调用函数 return 0; } 还没学到PE,所以先使用硬编码地址,在MessageBox下断点跟进MessageBoxA函数里。 0040D478 8B F4 mov esi,esp 0040D47A 6A 00 push 0 0040D47C 6A 00 push 0 0040D47E 6A 00 push 0 0040D480 6A 00 push 0 0040D482 FF 15 AC A2 42 00 call dword ptr [__imp__MessageBoxA@16 (0042a2ac)] 0040D488 3B F4 cmp esi,esp 0040D48A E8 E1 3B FF FF call __chkesp (00401070) 上面一大段都是检查参数是否合法的,从五个push开始是传参数,到最后一个call是真正调用MessageBox函数

const int *p 与 int const* p 和const int const *p区别

醉酒当歌 提交于 2020-01-12 03:22:04
const int * p 与 int const* p 和const int const * p区别 一、何为const const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。也就是说const常量,具有不可变性。 例如: const int Max=100; Max++; //操作错误 二、 指针常量与常量指针 1、指针常量 指针就是内存单元的地址,所谓指针常量,也就是这个指针变量的值不可改变,即指针只能唯一的指向一个地址,这个地址所对应的内存单元中的内容可以被修改 int* const p = &a; //指针常量 eg: //如果不想要看到错误信息的话,注释掉#define CONFIG_DEBUG这句 #define CONFIG_DEBUG int a, b; int * const p = &a; // 定义了一个只能指向a的地址的指针 *p = 666; //操作成功 #ifdef CONFIG_DEBUG p = &b; //操作失败,指向的地址不可更改 #endif 2、常量指针 顾名思义,常量指针就是指向常量的指针,只要你想让你指向的内存单元中的内容具有像常量那样的不可变性,就可以用常量指针去指向它,相比指针常量,常量指针可以指向任何类型的变量的地址。 就像给小屋(内存单元)里的东西(内容)贴了封条,屋门上上了一把锁,即便是用钥匙打开了屋门

数组指针和指针数组的区别

依然范特西╮ 提交于 2020-01-12 00:19:40
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

指针和引用的区别

假装没事ソ 提交于 2020-01-11 17:23:21
文章目录 引用和指针的区别 汇编层次解释引用 指针和引用函数调用的区别 引用的好处 引用和指针的区别 (1)引用必须初始化,指针可以不初始化且可以为空 (2)引用不可更改其绑定对象,指针可以改变其指向对象 (3)sizeof对于引用得到是绑定对象的大小,而指针为4个字节(32位下) (4)引用不是对象,指针是对象,所以不能定义引用的引用 (5)引用只能绑定在对象上,而不能绑定到字面值或某个表达式计算结果;但是常量引用能绑定到字面值上 汇编层次解释引用    指针和引用在汇编上是一样的,所以引用占用的内存空间的大小和指针一样。使用引用就相当于编译器默认对指针解引用一样。看下面的代码: int main ( ) { int x = 5 ; int & y = x ; return 0 ; } // 反汇编显示 . . . int x = 5 ; 009E2878 mov dword ptr [ x ] , 5 // 把立即数5放到地址为[x]所指向的4个字节的内存中 int & y = x ; 009E287F lea eax , [ x ] // 把[x]的地址给eax寄存器 009E2882 mov dword ptr [ y ] , eax // 把eax中的地址送给[y]指向的内存中 return 0 ; . . .   如上,也就是将x的地址赋给y,所以引用就是通过指针实现的

小学生都看得懂的C语言入门(5): 指针

落花浮王杯 提交于 2020-01-11 16:03:36
现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=6; printf("%d\n",sizeof(int));//4 printf("%d\n",sizeof(double)); //8 printf("%d\n",sizeof(a));//4 return 0; } 之前 ,我们看到scanf("%d", &x); 中& 表示什么意思? & 是为了获取变量的地址, 它的操作对象必须是变量, #include<stdio.h> int main() { int i=0; printf("%p\n",&i); // 打印地址 return 0; } 得到 000000000062FE4C #include<stdio.h> int main() { int i=0; int j; printf("%p\n",&j); printf("%p\n",&i); return 0; } 得到 000000000062FE48 000000000062FE4C C与8 在16进制下相差4,(c相当于12); 说明在内存中他们两个是紧挨着放的, C语言中分配变量是从顶向下的, 先定义的变量i 的地址更高, 后定义的变量j 的地址更低. #include<stdio

2019春第六周作业

坚强是说给别人听的谎言 提交于 2020-01-11 15:57:48
本周作业头 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://www.cnblogs.com/lwmzei6/p/10657271.html 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 <了解指针的定义及其运用,区别指针和数组的关系> 参考文献 A基础作业 1.函数题:求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1)我的代码 double fun (double *a, double *b) { double x; x

数组指针和指针数组的区别(2)

谁都会走 提交于 2020-01-11 10:07:38
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

C/C++ typedef用法详解

冷暖自知 提交于 2020-01-11 08:06:12
看别人的代码经常会出现但不知其用的typedef 用途2比较有用 转载https://blog.csdn.net/superhoy/article/details/53504472 第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如: [cpp] view plain copy struct tagPOINT1 { int x; int y; }; struct tagPOINT1 p1; 而在C++中,则可以直接写:结构名 对象名,即: tagPOINT1 p1; 估计某人觉得经常多写一个struct太麻烦了,于是就发明了: [cpp] view