精华内容
下载资源
问答
  • #include <iostream> #include <memory> class Student{ public: Student(int d) : data(d){ printf("xxx------>line = %d, d = %d\n",__LINE__,d);... Student *stu = new Stud.
    #include <iostream>
    #include <memory>
    #include <boost/smart_ptr.hpp>
    #include <boost/make_shared.hpp>
    
    class Student{
    public:
      Student(int d) : data(d){
    		printf("xxx------>line = %d, d = %d\n",__LINE__,d);
    	}
    	int data;
    };
    
    int main(){
    	//1.general point ----> smart point 
      Student *stu = new Student(10);
    	
    	std::shared_ptr<Student> ptr(stu);	
    	//Or:
    	//std::shared_ptr<Student> ptr = std::make_shared<Student>(15);	
    	printf("xxx------>line = %d, ptr->data = %d\n",__LINE__,ptr->data);
    
    		
    	//2.smart point ----> general point
    	Student *q;
    	//<1>
    	q = ptr.get();
    
    	//Or:
    	q = &(*ptr);
    	printf("xxx------>line = %d, q->data = %d\n",__LINE__,q->data);
    
    
    	//3.make_shared ----> general point
    	Student *mm = std::make_shared<Student>(15).get();
    	printf("xxx------>line = %d, mm->data = %d\n",__LINE__,mm->data);
    	
    	return 0;
    }
    

    展开全文
  • 指针和数组的转换

    2021-05-21 08:21:24
    本人喜欢例子说明。。#include int main(){int arr[4] = {1,2,3,4};int *p_arr = arr;int i = 0;printf("数组正常打印\n");for( i = 0; i <...printf("数组以指针形式\n");for( i = 0; i <...

    本人喜欢例子说明。。

    #include int main()

    {

    int arr[4] = {1,2,3,4};

    int *p_arr = arr;

    int i = 0;

    printf("数组正常打印\n");

    for( i = 0; i < 4; i++)

    {

    printf("%d ", arr[i]);

    }

    printf("\n");

    printf("数组以指针形式\n");

    for( i = 0; i < 4; i++)

    {

    printf("%d ", *(arr+i));

    }

    printf("\n");

    printf("指针数组正常打印\n");

    for( i = 0; i < 4; i++)

    {

    printf("%d ", *(p_arr+i));

    }

    printf("\n");

    printf("指针以数组形式打印\n");

    for( i = 0; i < 4; i++)

    {

    printf("%d ", p_arr[i]);

    }

    printf("\n");

    return 0;

    }

    从这例子可看出在一个函数内,指针和数组是可以相互表示的。

    以下说明一下数组和指针在 调用函数 和 被调用函数  的关系

    #include #include int *test_one(int *arr, int size)

    {

    //int tmp_arr1[4];

    //注意这里通过创建数组返回给调用函数是失败的

    //因为在函数返回时,数组就会被销毁,产生无效值,看到也只有首地址的值。

    //以下通过自己分配内存实现将在被调用函数中创建的数组返回给调用函数

    int *arr1 = (int*)malloc(4*sizeof(int));

    int i = 0;

    for(i = 0; i < size; i++)

    {

    printf("%d ", arr[i]);

    //tmp_arr1[size] = arr[i];

    arr1[i] = arr[i];

    }

    printf("\n");

    return arr1;

    }

    int main()

    {

    int arr[4] = {1,2,3,4};

    int *p_arr;

    int arr_one[4];

    p_arr = test_one(arr, 4);//通过指针接收函数的指针返回值。

    int i = 0;

    for(i = 0; i < 4; i++)

    {

    arr_one[i] = p_arr[i];//这里可以看出指针是可通过数组表示的。

    printf("%d ",*(p_arr+i));

    }

    printf("\n");

    free(p_arr);//个人分配的内存,就自己尽量销毁

    p_arr = NULL;

    return 0;

    }

    个人总结:

    1.   在一个同一函数内指针和数组是可以相互表示的,建议多用指针。

    2.   尽可能不要,在被调用函数中试图创建数组,并将其返回,这是不合理。

    所以我们应该在调用函数就声明好一个数组,将其传入被调用函数中,以供使用。

    3.  如果真的要在被调用函数创建数组并返回,请自己分配内存(如malloc),这里比较常用到时在项目初始化时。

    展开全文
  • 1、前言今天在看代码时,发现...如是果断上网查查,发现我的感觉是错误的,所以,任何事情能凭感觉,要弄清楚来龙去脉。先总结一下intptr_t类型,然后介绍指针与intptr_t类型的转换,最后给出测试程序。2、intptr...

    1、前言

    今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量。由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针。感觉很奇怪,为何要将一个指针这样做呢?如是果断上网查查,发现我的感觉是错误的,所以,任何事情不能凭感觉,要弄清楚来龙去脉。先总结一下intptr_t类型,然后介绍指针与intptr_t类型的转换,最后给出测试程序。

    2、intptr_t类型

    我接触最早的处理器是32位,目前64位处理器发展迅速。数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小。

    位数

    char

    short

    int

    long

    指针

    16

    1个字节8位

    2个字节16位

    2个字节16位

    4个字节32位

    2个字节16位

    32

    1个字节8位

    2个字节16位

    4个字节32位

    4个字节32位

    4个字节32位

    64

    1个字节8位

    2个字节16位

    4个字节32位

    8个字节64位

    8个字节64位

    为了保证平台的通用性,程序中尽量不要使用long类型。可以使用固定大小的数据类型宏定义,这些宏定义需要引用stdint.h头文件。

    /* There is some amount of overlap with as known by inet code */

    #ifndef __int8_t_defined

    # define __int8_t_defined

    typedef signed char int8_t;

    typedef short int   int16_t;

    typedef int    int32_t;

    # if __WORDSIZE ==

    typedef long int    int64_t;

    # else

    __extension__

    typedef long long int int64_t;

    # endif

    #endif

    /* Unsigned. */

    typedef unsigned char uint8_t;

    typedef unsigned short int uint16_t;

    #ifndef __uint32_t_defined

    typedef unsigned int uint32_t;

    # define __uint32_t_defined

    #endif

    #if __WORDSIZE == 64

    typedef unsigned long int uint64_t;

    #else

    __extension__

    typedef unsigned long long int uint64_t;

    #endif

    关于intptr_t的类型定义如下:

    //intptr_t类型是为指针准备的

    /* Types for `void *' pointers. */

    #if __WORDSIZE == 64

    # ifndef __intptr_t_defined

    typedef long int intptr_t;

    # define __intptr_t_defined

    # endif

    typedef unsigned long int uintptr_t;

    #else

    # ifndef __intptr_t_defined

    typedef int intptr_t;

    # define __intptr_t_defined

    # endif

    typedef unsigned int uintptr_t;

    #endif

    从定义可以看出,intptr_t在不同的平台是不一样的,始终与地址位数相同,因此用来存放地址,即地址。

    3、指针与intptr_t

    C语言指针用来保存变量或常量的地址,地址由处理器的位数决定。在windows程序中,经常用到句柄,其实就是一个地址,具备通用性,对底层进行了封装。先对这个理解不深刻,什么时候需要将指针转换为intptr_t类型。

    4、测试程序

    #include

    #include

    #include

    #include

    #include

    #include

    #define ID_STR_LEN 12

    #define NAME_STR_LEN 10

    typedef struct student

    {

    char id[ID_STR_LEN];

    char name[NAME_STR_LEN];

    uint8_t age;

    }student;

    student * create_student()

    {

    student *stu = (student *)malloc(sizeof(student));

    if (stu == NULL)

    return NULL;

    memset(stu, , sizeof(student));

    return stu;

    }

    void *free_student(student *stu)

    {

    if (stu)

    free(stu);

    }

    static void init_student(student * stu)

    {

    assert(stu);

    const char *id = "";

    const char *name = "Anker";

    uint8_t age = ;

    memcpy(stu->id, id, strlen(id));

    memcpy(stu->name, name, strlen(name));

    stu->age = age;

    }

    static int handle_student(intptr_t handle)

    {

    if (handle == )

    {

    return -;

    }

    student *stu = (student*)handle;

    printf("id: %s\n", stu->id);

    printf("name: %s\n", stu->name);

    printf("age: %u\n", stu->age);

    return ;

    }

    int main()

    {

    student *stu;

    stu = create_student();

    init_student(stu);

    //将指针转换为intptr_t类型

    intptr_t handle = (intptr_t)stu;

    handle_student(handle);

    free_student(stu);

    return ;

    }

    5、参考网址

    C语言指针的长度和类型

    本文地址:http://www.cnblogs.com/archimedes/p/point-length-type.html,转载请注明源地址. 如果考虑应用程序的兼容性和可移植性,指针的长度就是一 ...

    C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

    cocos2d-x getParent&lpar;&rpar; 获得一个父类的一个node型指针,转换为父类类型

    void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...

    C语言指针5分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里“引用”表示计算机内存地址.从指针指向的内 存读取数据称作指针的取值.指针可以指向某些 ...

    C语言指针的初始化和赋值

    1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示 ...

    C语言指针操作

    展开全文
  • 当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数; 当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。 #include <iostream> using namespace std; class Base ...
    • 当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;

    • 当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。

    #include <iostream>
    using namespace std;
    class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
                void h() { cout << "Base::h" << endl; }
    
    };
    class Derived:public Base
    {
    public:
        virtual void f(){cout<<"Derived::f"<<endl;}
                void g(){cout<<"Derived::g"<<endl;}
                void h(){cout<<"Derived::h"<<endl;}
    };
    
    
    int main()
    {
        Base *pB=new Base();
        cout<<"当基类指针指向基类对象时:"<<endl;
        pB->f();
        pB->g();
        pB->h();
        cout<<endl;
    
        Derived *pD=(Derived*)pB;
        cout<<"当父类指针被强制转换成子类指针时:"<<endl;
        pD->f();
        pD->g();
        pD->h();
        cout<<endl;
    
        Derived *pd=new Derived();
        cout<<"当子类指针指向子类时候"<<endl;
        pd->f();
        pd->g();
        pd->h();
        cout<<endl;
    
        Base *pb=(Base *)pd;
        cout<<"当子类指针被强制转换成父类指针时:"<<endl;
        pb->f();
        pb->g();
        pb->h();
        cout<<endl;
    
        Base *pp=new Derived();
        cout<<"父类指针指向子类对象时候:"<<endl;
        pp->f();
        pp->g();
        pp->h();
        cout<<endl;
    }
    

    在这里插入图片描述
    转载于——父类子类指针相互转换问题

    展开全文
  • #include "iostream" using namespace std;... /*结果为943142453,转换为int类型指针 + 1跳过四个字节,解指针时当作整形数据读取ASCII码, 先存5,后存8,因此读取时先读8的ASCII码(00111000),后...
  • C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布,结构体指针声明结构体的首地址,结构体成员声明该成员在结构体中的...
  • 指针与多维数组(主要指二维数组)int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};换个角度看世界:如首行一样,将首行视为一个元素,一个特殊的元素,这个“特殊的”元素是一个一维数组。那么这个二维数组是由是由三...
  • Golang类型转换指针String 类型转换 func TestImplicit(t *testing.T) { var a int32 = 1 var b int64 //使用隐式类型转换会失败 b = int64(a) var c MyInt //别名做隐式类型转换还是会报错,必须使用显示类型...
  • 我有一个8字节的char指针,里面存储了2个整数。我如何将它存储在int数组指针中,使int数组中的第1个整数是在 array[0] 而第2个整数是在 array[1].我做的代码到目前为止。char * wirte_buff= (char*) malloc(8*sizeof...
  • void * v; std::string *str = new std::string("苹果"); //对象类型转换为void指针 v = str;...//void指针转换为对象指针 std::cout<<*static_cast<std::string *>(v)<<std::endl;
  • 字符串float型 float chuli3(unsigned char* p) { char sign = 1; float temp = 0; int ttt = 1; char size = 0,flag=0; if (*p == '-') { sign -= 2; p++; } //小数点前开始 while (*p != '\0' &&...
  • C++智能指针(共享指针,唯一指针,自动指针) 已完结
  • (除此之外,正如其他人所指出的那样,由于破坏严格的别名,指针的解引用是未定义的行为.) 您可能想要的是投射d的值: static_cast(d); 然后,您可以将该值存储在正确类型的对象中: float f = static_cast(d); float * ...
  • 这个bug引起的原因是因为指针指向同一个地方,所导致的问题。 错误修改前的使用 std::vector<char*> data; std::vector<std::string> result; result.push_back("123"); result.push_back("456");...
  • 首先说个最特殊的指针 void×,这个是当初为了指针转化的方便,设立的一个万能指针。任何指针都能与之转化。看两个定义:typedef int ×t; t a[10];typedef int t[10] ; t *a;首行先定义了一个整型指针类型,然后在...
  • Golang指针和C++指针的简单剖析

    热门讨论 2021-04-04 20:39:22
    不止C++才有指针,Golang也有指针呦!二者有哪些区别呢?今天就来看一看。 正文 什么是指针指针是用来指向任何一个变量的内存地址的类型,它所指向的变量的内存地址在 32 和 64 位机器上分别占用 4 或 8 ...
  • c语言 指针详解

    2021-05-21 02:28:01
    虽然是16位,不过他的寻址方式只是用指针,系统还要配合段继存器(16位系统当然也是16的的继存器了)来寻址,合起来也就是4个字节了.现在的32位跟16的差不多,不过由于WINDOWS系统所有的数据段...
  • 二维数组和指针二维数组和指针1、二维数组和数组元素的地址若有以下定义:int *p,a[3][4];1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的每一个成员又是一个一维数组...
  • C语言之指针若干问题

    2021-05-22 07:12:04
    / 这是给Pointer 所指的变量赋值,刚创建Pointer时,它所指的变量是固定的,可能是某个重要的系统变量。这样赋值,在编译的时候不会报错,但实际上是存在错误的。变量的地址就是变量的指针指针变量就是变量存储...
  • java中到底有没有指针

    千次阅读 2021-02-27 16:53:21
    那么,java中的引用(reference)和c/c++中的指针(如无特别说明,后文指针均指c/c++中的指针)究竟有着什么样纠葛清的关系呢?在开始之前先说一下c/c++的引用,它跟java的引用完全不是一个东西,c/c++的引用是同一块...
  • 一个代码: 代码如下: #include #include #define uchar unsigned char #define uint unsigned int void display...给指针只能传地址,能传值.否则要做强制类型转换. 2.在做类型转换和赋值时候,应该注意赋值的类型匹配.
  • 使用list.stream()map报空指针

    千次阅读 2021-07-16 11:39:40
    在项目中需要将list成map形式,采用java8的stream流 mileageList.stream().collect(Collectors.toMap(MileageMonitorDto::getId,MileageMonitorDto::getValue,(k1,k2)->k1)); 测试中无问题,发布线上,发现...
  • 文章目录前言一、指针是什么?1.数据在内存中的存储2.一个小的单元到底是多大?二、指针变量1.什么是指针变量2.指针类型3.指针类型的作用三、野指针1.什么是野指针2.野指针成因2.1. 指针未初始化2.2指针越界访问2.3...
  • 转指针,手撕c语言(深入理解指针基础)

    千次阅读 多人点赞 2021-10-04 17:54:52
    转指针,手撕c语言(深入理解指针基础) 前言 目录 一.指针基础 (1)概念理解 (2)实例理解 (3)地址运算符和间接运算符 二.字符指针与字符数组 (1)字符数组方式 (2)字符指针方式 (3)联系 三.指针...
  • NullPointerException这个东西换一个角度来看,没准是好处也一定。可以说,NullPointerException本身也是JAVA安全机制的一部分。有UNIX写C和C++的经验的可能都知道,空指针会导致什么问题:经常会导致程序的崩溃...
  • C语言中指针的理解4:指针与强制数据类型转换1.变量的数据类型的含义2.指针的数据类型的含义 1.变量的数据类型的含义 首先来看这样一道2016年的408考试真题: 有代码:short si=-32767; unsigned short usi=si;,...
  • #include<stdio.h> #include<string.h> #include<ctype.h> #define LEN 81 char *s_gets(char *st, int n);...//函数指针 数据指针 void ToUpper(char *); // 把字符串转换为大
  • c语言指针用法详解,通俗易懂超详细!

    千次阅读 多人点赞 2021-07-18 00:10:30
    文章自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#includestructabc{unsignedintnum;charc;};typedefabc*pabc;voidmain(){clrscr();printf("astringis:dos=(H)646F73=(B)011001000110111101110011\n");...
  • //利用指针将二维数组转换成一维数组 int main(int argc, char* argv[]) { int num[5][5] = {1,2,3,4,5,6,7,8,9,10}; int sum[20]; int* p = &num[0][0]; for (size_t i = 0; i < 10; i++) { sum

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 753,011
精华内容 301,204
关键字:

哪个指针转不了