指针

【C语言】取值符&和间接值*辨析

独自空忆成欢 提交于 2020-03-01 23:08:00
计算机程序在存储数据时必须跟踪三种基本属性: 数据是什么 类型 信息在存储器中的 地址 存储的 值 是多少 众所周知,对于常规变量a, &a 是存储地址,a是值。对于指针变量p,p是存储地址, *p 则是值。下面通过一个例子来辨析 取值符& 和 间接值* (indirect value) #include <iostream> using namespace std; ///* & 辨析 int main() { int a; a=10; cout<<&a<<endl; int & b=a;//这里的b是一个reference,初始化时必须赋值。 cout<<&b<<":"<<b<<endl; int* c=&a;//同类型之间才能赋值,&a是(int*)类型 cout<<c<<":"<<*c<<endl; return 0; } /*output 0x28ff04 0x28ff04:10 0x28ff04:10 */ /*a和b区别: (gdb) p a $2 = 10 (gdb) p &b $3 = (int *) 0x400970 (gdb) p b $4 = (int &) @0x7fffffffe55c: 10 */ 可以看出,b不是真正意义上的int类型,但是可以当作int用。&b就是(int*) 所以我们要想在参数传递中修改实参的值,就要通过[1]中 Exchg2

C++调试中,怎样看到指针指向空间中的所有数据

你离开我真会死。 提交于 2020-03-01 23:04:39
调试的时候在想看的数组上点右键,选择快速监视(QuickWatch),弹出一个窗口后,如果你想要看这个数组的前10个元素,就在第一个编辑框数组名的后面写逗号,然后10,想看100个元素,就写个逗号,写个100。 来源: CSDN 作者: whut熊航 链接: https://blog.csdn.net/weixin_43951960/article/details/104599260

为什么要使用指针? [关闭]

随声附和 提交于 2020-03-01 22:20:05
我知道这是一个非常基本的问题,但是在使用高级语言编写了一些项目之后,我才开始进行一些基本的C ++编程。 基本上我有三个问题: 为什么在普通变量上使用指针? 我应该在何时何地使用指针? 如何将指针与数组一起使用? #1楼 在变量上使用指针的一种方法是消除所需的重复内存。 例如,如果您有一些大型的复杂对象,则可以使用指针为您所做的每个引用指向该变量。 使用变量,您需要为每个副本复制内存。 #2楼 在某些情况下,需要使用函数指针才能使用共享库(.DLL或.so)中的函数。 这包括跨语言执行操作,通常会提供DLL接口。 制作编译器 做科学的计算器,在哪里有函数指针的数组或向量或字符串映射? 尝试直接修改视频内存-制作自己的图形包 制作一个API! 数据结构-您正在制作的特殊树的节点链接指针 指针有很多原因。 如果您想保持跨语言兼容性,则在DLL中进行C名称处理尤其重要。 #3楼 这是我的助手,我不会答应成为专家,但是我发现指针在我要编写的其中一个库中很棒。 在这个库中(这是带有OpenGL的图形API :-),您可以创建一个三角形,并向其中传递顶点对象。 draw方法采用这些三角形对象,并根据我创建的顶点对象来绘制它们。 好吧,没关系。 但是,如果我更改顶点坐标怎么办? 用顶点类中的moveX()移动它还是其他东西? 好吧,好的,现在我必须更新三角形,添加更多的方法,并且浪费了性能

LeetCode笔记之双指针(一)

只愿长相守 提交于 2020-03-01 22:08:28
双指针在算法中无论是数组还是链表类题目中都是重要且常见的“套路”之一。 两数之和 输入一个 递增排序 的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 巧用双指针 class Solution { public int[] twoSum(int[] nums, int target) { int[] ret = new int[2];     //首尾各一个指针,根据有序性移动指针 int index1=0,index2 = nums.length-1; while(index1<index2&&nums[index1]+nums[index2]!=target){ if(nums[index1]+nums[index2]<target){ index1++; }else{ index2--; } } ret[0] = nums[index1]; ret[1] = nums[index2]; return ret; }} 最接近的三数之和 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 先固定一个数,然后前后各一个指针,进行遍历找最接近! class Solution { public

8.动态内存管理malloc calloc realloc free

半世苍凉 提交于 2020-03-01 21:24:36
malloc 描述 C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。 声明 下面是 malloc() 函数的声明。 void *malloc(size_t size) 参数 size – 内存块的大小,以字节为单位。 返回值 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 realloc 描述 C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。 声明 下面是 realloc() 函数的声明。 void *realloc(void *ptr, size_t size) 参数 ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。 size – 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。 返回值 该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。 calloc 描述 C 库函数 void

二维数组的指针表示

≯℡__Kan透↙ 提交于 2020-03-01 21:12:45
1.类型说明 int *b; //定义一个int型指针变量 int *p[3]; //定义一个int型指针数组的变量 int (*)[3] 或 int(*d)[3]; //定义一个数组指针变量 2.初始化赋值 假设二维数组为: int a[3][3] ={{0,1,2},{3,4,5},{6,7,8}}; (1)用指针b表示二维数组时为: int *b=a[0]; //将指针b指向a的首元素地址 二维数组的表示方式为: a[i][j]= (b+3 i+j) ; //因为二维数组也是存放在连续地址上,只需要移动指针位置就可以了 (2)用指向整形数组指针的变量c来表示: int (*c)[3]=a; //将它指向a的首地址,数字中每一个单元代表a的每一行 二维数组的表示方式为: a[i][j]= ( (c+i)+j); // (c+i)+j表示a[i][j]地址,而 (*(c+i)+j);表示a[i][j]的值 (3)int型指针数组使用方式: p是一个包含3个int型指针的数组,使用时,根据下标指向目标地址即可,如: p[0]=&a[0][0]; p[1]=&a[0][1]; p[2]=&a[0][2] ; //指向3个整形变量 需要单独赋值,p[0] , p[1] , p[2]并不是连续给定。 来源: CSDN 作者: ghost_zc 链接: https://blog.csdn

C++程序设计(面向对象进阶)崔毅东 ——第3单元第01节空指针和动态内存分配

蓝咒 提交于 2020-03-01 20:23:51
nullptr and Dynamic Memory Allocation (空指针和动态内存分配) 1. 空指针 1.1. 0带来的二义性问题 C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。 C语言中,空指针使用(void *)0来表示 有时候,用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0) 1.2. C++标准化委员会希望“空指针”是一个确定的东 C++11中引入保留字“nullptr”作为空指针 2. Dynamic memory management: Allocate/Release (动态内存管理:分配/释放) 2.1. C++中通过运算符new申请动态内存 new <类型名> (初值) ; //申请一个变量的空间 new <类型名>[常量表达式] ; //申请数组 如果申请成功,返回指定类型内存的地址; 如果申请失败,抛出异常,或者返回空指针(nullptr)。(C++11) 2.2. 动态内存使用完毕后,要用delete运算符来释放。 delete <指针名>; //删除一个变量/对象 delete [] <指针名>; //删除数组空间 2.3.c和c++关于动态内存分配的区别 3.空指针和动态内存分配代码示例 # include <iostream> int main ( ) { int * p =

剑指Offer--复杂链表的复制

走远了吗. 提交于 2020-03-01 17:57:51
题目 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空); 我的思路 先不管特殊指针,先完成链表的复制,然后在循环给特殊指针赋值; 自己写的low代码 /* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) { return null; } RandomListNode head = new RandomListNode(-1); // 头指针; RandomListNode q = head; RandomListNode p = pHead; // 先不管random while (p != null) {// RandomListNode newNode = new

指针 * 跟类型还是变量名

佐手、 提交于 2020-03-01 17:52:39
星号跟谁? 算是指针系列的一个番外篇, 星号到底跟谁? #include <stdio.h> int main() { char * greet = "Hello World"; printf("%s", greet); return 0; } 单看 greet 是 char* 类型, 表示 N 个 char , 我就是全部; 但看 *greet 是 char 类型, 但有 N 个, 我是第一个. 不同表达, 不同含义. 下面一个简单的函数可以区别. #include <stdio.h> int main() { printf("%c", *greet); printf("%s", greet); return 0; } 略概看了些开源框架, 规范的写法还是跟名字 char *greets . 来源: https://www.cnblogs.com/swyw/p/12390936.html

Boost库-内存管理-智能指针-weak_ptr

…衆ロ難τιáo~ 提交于 2020-03-01 17:26:13
#include<iostream> #include<boost\weak_ptr.hpp> #include<boost\shared_array.hpp> int main(int argc, char** argv) { boost::shared_ptr<int> sp0(new int(100)); std::cout <<" sp0.use_count == " <<sp0.use_count()<< std::endl; boost::weak_ptr<int> wp0(sp0); std::cout << " wp0.use_count == " << wp0.use_count() << std::endl; if (!wp0.expired()) { boost::shared_ptr<int> sp1 = wp0.lock(); *sp1 = 111; std::cout << " wp0.use_count == " << wp0.use_count() << std::endl; } std::cout << " wp0.use_count == " << wp0.use_count() << std::endl; sp0.reset(); std::cout << " wp0.use_count == " << wp0.use_count() <<