指针

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

依然范特西╮ 提交于 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,所以引用就是通过指针实现的

在用free()函数释放指针内存时为何要将其指针置空

只谈情不闲聊 提交于 2020-01-11 16:48:48
在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题。释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将指针置空有助于判断一个指针所指向的空间已经被释放。 内存泄露:   例如:int *p = (int *)malloc(sizeof(int)),如果在用p只想其他地址,则原本malloc()分配的地址便找不到了,造成内存泄露的后果。 free(p)后,p是一个非法指针,不可以对他进行访问。为了防止忘记对释放内存后的指针的置空,可以在函数的开头宏定义一个函数 #define free(p)   if(p) { free(p); p = NULL; } 来源: https://www.cnblogs.com/zoutingrong/p/12178631.html

小学生都看得懂的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

Go GC: Latency Problem Solved

假如想象 提交于 2020-01-11 14:34:05
https://talks.golang.org/2015/go-gc.pdf https://www.oschina.net/translate/go-gc-solving-the-latency-problem-in-go-1-5?comments&p=1 Go: 成千上万的 goroutines 使用管道进行同步 执行 go 的运行时间,使 go 和用户同步 空间位置的控制 (可以嵌入结构,内部指针 (&foo.field)) Java: 数十个Java线程 使用对象/锁的同步 由C实现的运行时间 对象连接指针 最大的区别在于空间位置的问题。 在Java中, 一切都是指针,然而 Go 能够让你在线程中嵌入另一个线程。以下的多层指针严重地导致了垃圾回收器的很多问题。 https://learnku.com/docs/go-blog/go15gc/6528 Go GC: 优先考虑效率和简洁 来源: https://www.cnblogs.com/yuanjiangw/p/12179627.html

数组指针和指针数组的区别(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++——对象的动态建立和释放(new 和delete)

半城伤御伤魂 提交于 2020-01-11 08:29:51
3.8 对象的动态建立和释放 1 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。 注意: new和delete是运算符,不是函数,因此执行效率高。 2)虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new运算符的例子: new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址 new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址 float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p 3)new和delete运算符使用的一般格式为: 用new分配数组空间时不能指定初值

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

JAVA 中的null

对着背影说爱祢 提交于 2020-01-11 07:46:23
对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java。 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针、操作符重载、多继承实现的原因,null却与此正好相反。好吧,我真的不知道这个问题的答案,我知道的是不管null被Java开发者和开源社区如何批评,我们必须与null共同存在。与其为null的存在感到后悔,我们倒不如更好的学习null,确保正确使用null。 为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。以我的经验来看,导致空指针异常的一个最主要的原因是对Java中null的知识还不够。你们当中的很多已经对null很熟悉了,但是对那些不是很熟悉的来说,可以学到一些关于null老的和新的知识。让我们一起重新学习Java中null的一些重要知识吧。 Java中的Null是什么? 正如我说过的那样,null是Java中一个很重要的概念