C++ 指针 技术教程文章

c/c++中的函数指针和指针函数

定义 1.指针函数,本质是函数,返回值为指针,形如,int *pfun(int, int),由于“*”的优先级低于“()”的优先级,所以等同于int *(pfun(int, int)) 2.函数指针,本质是指针,返回一个函数,形如,int (*pfun)(int, int),括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为...

C++ 智能指针shared_ptr的实现

#include <memory> #include <iostream> using namespace std;template<typename T> class smart{ private:T* _ptr;int* _count; //reference counting public://构造函数smart(T* ptr = nullptr):_ptr(ptr){if (_ptr){_count = new int(1);}else{_count = new int(0);}}//拷贝构造smart(const smart& ptr){if (this != &ptr){this->_ptr = ptr._ptr;this->_count = ptr._count;(*this->_count)++;}}//重载operator=smart operator...

复习C++_指针【图】

注意:++i指的是先计算i+1,然后将其赋给i cout<<str[7]<<endl; //输出a

C++primer第五版 函数指针【图】

指针在c++中既是重点又是难点,最开始学指针的时候就已经很绕了,然后接触函数指针的时候,就彻底晕了。很多书在编写函数指针这一块时讲得并不清楚,这里推荐一篇总结函数指针还不错的博客,可以学习一下 https://www.cnblogs.com/zrtqsk/p/4254765.html 函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。 这里,我先以C++primer第五版6.7节的...

C++之动态内存与智能指针以及底层实现原理【代码】

文章目录 1.动态内存2.shared_ptr类 1.动态内存 new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存动态内存容易出现的问题:如果忘记释放内存,就会产生内存泄漏;如果在尚有指针引用内存的情况下释放了该内存,就会产生引用非法内存的指针 2.shared_ptr类 shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象...

C++11:21通过智能指针管理第三方库分配的内存【代码】

21、通过智能指针管理第三方库分配的内存 0、课前秀第三方库分配的内存一般需要通过第三方库提供的释放接口才能释放,由于第三方库返回的指针一般都是原始指针,在用完之后没有调用第三方库的释放接口,就很容易造成内存泄露。1、示例第三方库的释放(可能会存放跟new,delete一样,忘记释放或走不到分支)void* p = GetHandle()->Create(); //do something... GetHandle()->Release(p);用智能指针暂时解决void* p = GetHandle()->C...

C++(2)----智能指针与动态内存【代码】【图】

C++ 11提供的智能指针有:shared_ptr、unique_ptr、weak_ptr。在 头文件 memory 中。 一、new delete 直接管理内存 1、初始化string * ps = new string // 初始换为一个空string int * pi = new int ;//pi 指向一个未初始化的int,*pi 未定义int * pi = new int(1024); // pi 指向的对象值为1024 string *ps = new string(10,9) ; // *ps 为"9999999999"vector<int> *pv = new vector<int>{0,1,2,3,4,5,6,7,8,9};2、释放deleteint ...

c/c++二级指针动态开辟内存【代码】

c版:#include <stdio.h>#include <stdlib.h>#define row 4#define col 8 int main(){int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 p = malloc(sizeof(int *)*row);for(i=0;i<row;i++){p[i]= malloc(sizeof(int)*col);}//初始化for(i=0; i<row; i++){for(j=0; j<col; j++){p[i][j] = j*i;}} //打印数据 for(i=0; i<row; i++){for(j=0; j<col; j++) { if(j==0) printf("\n"); printf("%d \t",p[i][j])...

C++数组、指针、动态内存分配【代码】【图】

二维数组作为函数的参数问题#include<iostream> using namespace std; void print(int n,int a[][10]){//形参a是一个n行二维数组的首地址for(int i=0;i<n;i++){for(int j=0;j<10;j++){cout<<a[i][j]<<" ";}cout<<endl;} } int main(){int k[3][10]={{0,1,2,3,4,5,6,7,8,9},{1,2,3,4,5,6,7,8,9,10},{2,3,4,5,6,7,8,9,10,11}};print(3,k);//传入二维数组的首地址 }//另外函数定义时也可以这样定义 void print(int n,int *a[10]),代表...

在Linux上,在C/C++中,指针是否会有MSB设置?

我想使用一个长整数,当设置MSB时它将被解释为数字,否则它将被解释为指针.那么这项工作还是会在C或C中遇到问题? 这是在64位系统上. 编辑清晰和更好的描述.解决方法:在x86-64上,你将有一个超过47位的指针,其地址设置为第63位,因为“架构支持的最大位数”(当前为48位)以上的所有位都必须具有相同的值作为价值本身最重要的一点. (这是0007以上的任何地址FFFF FFFF FFFF将是FFF8 0000 0000 0000 – 其间的所有内容都是“无效”作为指针...

从默认析构函数学习c++,new,delete,内存泄漏,野指针【代码】

默认析构函数: 当系统没有显式定义析构函数,编译器同样会为对象定义一个默认析构函数,默认的析构函数只能释放普通数据成员所占用的空间,无法通过释放通过new和malloc进行申请的空间,因此避免内存泄漏,我们要显式的析构函数对申请的空间释放。 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 动态分配内存: new是...

c++中字符数组内存和指针问题示例解答

char* id = "123456"; char* c= ":SN="; unsigned char buffer[20]; int j = 0; for (int i = 0;i < strlen(c);i++) { buffer[j] = c[i]; j++; } for (int i = 0;i < strlen(id);i++) { buffer[j] = id[i]; j++; } buffer[j] = ;; buffer[j + 1] = \0; buffer[j + 2] = 204; unsigned char* a =(unsigned char*)buffer; unsig...

二级指针动态分配内存(C / C++)

俗话说,没有对比就没有伤害。本文提供两个语言版本的二级指针分配方法。 C语言版本#include <stdio.h> #include <stdlib.h>#define row 4 #define col 8 int main() {int **p; int i,j; //p[4][8] //开始分配4行8列的二维数据 p = malloc(sizeof(int *)*row);for(i=0;i<row;i++){p[i]= malloc(sizeof(int)*col);}//初始化for(i=0; i<row; i++){for(j=0; j<col; j++){p[i][j] = j*i;}} //打印数据 for(i=0; i<row; i++)...