精华内容
下载资源
问答
  • 怎么 智能指针 直接赋值? 比如 : CComPtr<Itest>TT = 0x12345678;//就是这个意思 谢谢。
  • 这是因为在很多硬件相关的场合,需要直接操作某个特定值的地址空间(例如一个给定地址的寄存器),这个时候给指针赋值然后操作它就变得很有用,不过这样的操作通常不会发生在用户态的应用程序中。 如下代码不会报错 ...

    int *p = (int *)654321;
    就像这样,这个操作会在存放p这个指针变量的内存空间处写上了654321,这不会有什么问题,就像你给一个变量赋值一样,不管这个待赋值是多少,赋值操作本身都不会有问题。

    唯一可能带来问题的是对这样一个指针的解引用操作,例如

    *p=123456;
    因为654321这个地址你不知道是不是一块合法的地址,而往654321这个地址上写数可能会导致程序错误,或者直接segment fault,具体情况就要看这个地址本身了。既然指针不能随意赋值,那C语言为什么还要保留这样的特性呢?这是因为在很多硬件相关的场合,需要直接操作某个特定值的地址空间(例如一个给定地址的寄存器),这个时候给指针赋值然后操作它就变得很有用,不过这样的操作通常不会发生在用户态的应用程序中。

    如下代码不会报错
    int a=12;
    p=&a;
    *p=123;

    printf("*P的值为%d\n",*p);

    *P的值输出为123;

    展开全文
  • 指针汇编语言中LEA与MOV指令小结 - it610.com​www.it610.com总结一下汇编中mov,lea指令的区别 - 渣渣爱学习 - 博客园​www.cnblogs.com 文章中写道: ( LEA AX,[1000H],作用是将内存单元[1000H]的偏移地址...

    问题:

    观察如下代码:

    	int a = 1;
    	int *p = &a;
    	auto p_ptr = p;//1
    	auto &p_ptr2 = p;//2
    

    上述代码中1处和2处操作,哪个效率更高呢?

    反汇编解读:

    	int a = 1;
    00118178  mov         dword ptr [a],1  
    	int *p = &a;
    0011817F  lea         eax,[a]  
    00118182  mov         dword ptr [p],eax  
    	auto p_ptr = p;//1
    00118185  mov         eax,dword ptr [p]  
    00118188  mov         dword ptr [p_ptr],eax  
    	auto &p_ptr2 = p;//2
    0011818B  lea         eax,[p]  
    0011818E  mov         dword ptr [p_ptr2],eax  

    auto p_ptr = p;//1 此处在vs的反汇编中表示的是

    (MOV在汇编语言中是 数据传送指令。)

    00118185  mov         eax,dword ptr [p]   //将p放到寄存器当中
    00118188  mov         dword ptr [p_ptr],eax //将寄存器中的数据传送给p_ptr

    -----------------------------------------------------------------------------------

    auto &p_ptr2 = p;//2 此处在vs的反汇编中表示的是

    (LEA 其取变量的地址)

    0011818B  lea           eax,[p]   //取变量p的地址,存放在寄存器中
    0011818E  mov         dword ptr [p_ptr2],eax //将寄存器中的数据传送给p_ptr

    dword 双字 就是四个字节
    ptr pointer缩写 即指针

    汇编语言中LEA与MOV指令小结 - it610.comwww.it610.com总结一下汇编中mov,lea指令的区别 - 渣渣爱学习 - 博客园www.cnblogs.com

    文章中写道:

    ( LEA AX,[1000H],作用是将内存单元[1000H]的偏移地址1000H送至AX;

    MOV AX,[1000H],作用是将内存单元[1000H]的内容1234H送给AX)

    What is the difference between MOV and LEA?stackoverflow.com
    22fe5c185476f64759d81e841d76ca18.png
    • LEA 加载有效地址
    • MOV 表示负载值
    • lea只执行计算,它不加载任何东西,加载意味着触摸内存
    https://www.youtube.com/watch?v=mKcWIA1vKOwwww.youtube.com

    有人会质疑是否和编译器优化有关系

    经过验证发现,只要创建对象被使用过,其汇编release和debug是类似的。若申请了但是未使用,优化前后的代码会有区别。

    如下为debug语句:

    	int a = 1;
    00778178  mov         dword ptr [a],1  
    	int *p = &a;
    0077817F  lea         eax,[a]  
    00778182  mov         dword ptr [p],eax  
    	auto p_ptr = p;//1
    00778185  mov         eax,dword ptr [p]  
    00778188  mov         dword ptr [p_ptr],eax  
    	auto &p_ptr2 = p;//2
    0077818B  lea         eax,[p]  
    0077818E  mov         dword ptr [p_ptr2],eax  
    

    如下为release反汇编

    	int a = 1;
    	int *p = &a;
    	auto p_ptr = p;//1
    	auto &p_ptr2 = p;//2------>未使用
    	cout << &p<<p<<endl;
    00E112B0  mov         ecx,dword ptr ds:[0E13040h]  
    00E112B6  lea         eax,[a]  
    00E112B9  push        0E11750h  
    00E112BE  push        eax  
    00E112BF  mov         dword ptr [p],eax  
    00E112C2  lea         eax,[p]  
    00E112C5  push        eax  
    00E112C6  mov         dword ptr [a],1  
    00E112CD  call        dword ptr ds:[0E13024h]  
    00E112D3  mov         ecx,eax  
    00E112D5  call        dword ptr ds:[0E13024h]  
    00E112DB  mov         ecx,eax  
    00E112DD  call        dword ptr ds:[0E13048h]  

    使用了p_ptr2的反汇编:

            int a = 1;
    	int *p = &a;
    	auto p_ptr = p;//1
    	auto &p_ptr2 = p;//2
    	cout << &p << p << p_ptr2 << &p_ptr2<<endl;
    000B12B0  mov         ecx,dword ptr ds:[0B3040h]  
    000B12B6  lea         eax,[a]  
    000B12B9  mov         dword ptr [p],eax  ----->新增
    000B12BC  lea         eax,[p]  
    000B12BF  push        0B1760h  
    000B12C4  push        eax  
    000B12C5  lea         eax,[a]  
    000B12C8  mov         dword ptr [a],1  
    000B12CF  push        eax  
    000B12D0  push        eax  
    000B12D1  lea         eax,[p]  
    000B12D4  push        eax  
    000B12D5  call        dword ptr ds:[0B3024h]  
    000B12DB  mov         ecx,eax  
    000B12DD  call        dword ptr ds:[0B3024h]  
    000B12E3  mov         ecx,eax  
    000B12E5  call        dword ptr ds:[0B3024h]  
    000B12EB  mov         ecx,eax  
    000B12ED  call        dword ptr ds:[0B3024h]  
    000B12F3  mov         ecx,eax  
    000B12F5  call        dword ptr ds:[0B3048h]  

    mov和lea

    展开全文
  • struct A里的成员是结构体指针而b_arry和c_arry是结构体数组的地址。 2. 结构体经过以下传递会不会造成数据的混乱? 比如有一个函数void func (void *arg); 往函数里面传参,如func (&a); (a按照问题1里进行了...
  • 今天看到了gets()与puts()函数,发现了一个奇怪的点:字符串可以直接赋值给字符指针变量。例如以下: char * p="EDS"; puts(p); //输出结果为EDS 学过指针让我清楚明白了指针变量是不能直接赋值的,而这里的字符...

    今天看到了gets()与puts()函数,发现了一个奇怪的点:字符串可以直接赋值给字符指针变量。例如以下:

    char * p="EDS";
    puts(p);    //输出结果为EDS

    学过指针让我清楚明白了指针变量是不能直接赋值的,而这里的字符指针却直接被赋值字符串。这让我深感疑惑了,经过查阅,才知道:

    char * p="EDS"; 双引号在这里做了这三件事情:

    • 1. 申请了空间(在常量区),存放了字符串 
    • 2. 在字符串尾加上了'/0'    
    • 3. 返回该字符串的首地址

    先来看puts()这个函数 

    函数原型

    int puts(const char *string);

    参数

    输入:字符串指针

    输入可以是字符串数组,也可以是字符串常量,例如:

    char a[15]="1234";    //字符串数组
    char * p="EDS";    //字符串常量
    p=a;    //将a的首地址赋值给p,p指向了a字符串数组
    puts(p);    //输出结果为1234

    puts()函数的输入是一个字符串指针。当使用一个字符串数组名作为输入时,数组名此时表示一个指向数组的指针值,这符合puts()的输入要求,并能够正确输出。但是,当输入为一个字符串常量时,函数仍然能够正常的输出字符串。 
    理由如下: 

    1. 如上所述,双引号的加入,返回了字符串常量的地址值,即指针,这样才能够满足puts()函数对输入参数的要求,而这个指针应该指向了字符串常量实际所在的地址。 
    2. 程序运行时,双引号分配了常量区空间,字符串常量将占用内存空间,这样才能保证puts()函数能通过指针找到要输出的数据。 既然字符串常量占用内存,那么应该就能够通过得到它的地址并输出。

    另外看一下下面的这组区别,char a[10] = “hello”; 这是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理,但是换成char a [10],然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个地址常量,所以不能给常量赋值。所以,可以把字符串赋值给指向字符指针变量p,而不能把字符串赋值给一个字符数组。

    展开全文
  • int main(void) { float a[][3]={{1,2,3},{4,5,6},{7,8,9}}; float * p; int i; ... // 多维数组名为什么不能直接给指针 for(i = 0;i ;i++) printf(" %5.2f",* p++); printf("\n"); retur
    int main(void)
    {
        float a[][3]={{1,2,3},{4,5,6},{7,8,9}};
        float * p;
        int i;
        p = a;  //  多维数组名为什么不能直接赋给指针
        for(i = 0;i < 9;i++)
        printf(" %5.2f",* p++);
        printf("\n");
        return(0);
    }

    展开全文
  • #define M “hello world” ...我的理解是:因为str是一个随机值,直接指向了内存中的某一个位置,那么对它赋值后相当于直接修改了该地址后的内容,在某些时候(这个概率应该很低)应该会引起系统异常。
  • 在公有派生的情况下,派生类的指针可以直接赋值给基类指针。但即便基类指针指向的是一个派生类的对象,也不能通过基类指针访问基类没有而派生类中有的成员。基类的指针不能赋值派生类的指针。但是通过强制类型转换...
  • #define M "hello! char * m; m=M; puts(m);" 简略了代码,不要注重细节。 m不是存储的是指针吗,M不是字符串常量吗,但为什么Mm赋值,最后执行结果还是现实的是正确的“hello!”呢?
  • 你能够通过n级指针去修改n-1级指针的内容,甚至直接修改指针所指向的内存空间 例如: 你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。这个时候,你就可以将这个字符串指针的地址传递...
  • 我要做一个测试程序,把一个函数单独拿出来测试时间。现在这个函数有4个指针参数。 比如 test(*a, *b, *c, *d);...我想是不是因为给指针了内存地址,但是内存里面没有值得原因。 大神快来帮忙啊。。。。
  • c中数组指针赋值

    2020-09-06 10:51:58
    1.直接用数组名赋给指针,则指针指向数组的第一个元素的地址. 2.也可以指定数组的某一个元素,这时要加上&符号: #include <stdio.h> int main () { int var[] = {10, 100, 200}; int *ptr,*qtr; int i=1;...
  • 1、特定地址赋值的方法: 比如0x4E000000的地址赋值10 (*(volatile unsigned *)0x4E000000)=10 2、函数指针定义需要用到关键字typedef 例如:typedef int (*initOSFile_func_t)(void); 这个时候initOSFile_func_...
  • 今天使用某个函数,其中的参数是类型为char**, 使用了一个固定的二维数组,将其赋值给予,编译时产生警告;在运行的调用的函数(其中没有任何对字符串内容的修改),打印其中的字符串,直接崩溃。 警告内容:...
  • 不能直接将字符串赋值给指针

    千次阅读 2019-03-23 23:24:24
    int main() { char a[3][4]; a[0]="AAA";//运行错误, error C2440: “=”: 无法从“const char [4]”转换为“char [4]” strcpy(a[1],"BBB");//运行正确 }
  • 指针能用立即数直接赋值吗?

    千次阅读 2018-09-20 10:25:24
    学习的过程中产生了这个疑问:指针变量本身是一个地址,那么能直接用地址的值赋给指针吗? 答案是可以,只要加一个类型强制转换,比如定义了 int * p; 可以接着 p=(int*) 0x04;  此时我又想,那么可以把一个存着...
  • 上一篇中已经讲到,通过c++的赋值兼容规则,public方式的派生类对象的地址是可以直接赋值给基类类型指针的。那么如果我不利用c++的赋值兼容规则,而是通过将public派生类对象地址强制转换为基类指针后赋值基类指针...
  • 你能够通过n级指针去修改n-1级指针的内容,甚至直接修改指针所指向的内存空间 例如: 你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。这个时候,你就可以将这个字符串指针的地址传递...
  • 问题陈述: 通常大家会遇到这样的问题: char * p = "abc";可以顺利执行,而int *a = 1;确运行不了(这里指运行环境是VC,GCC竟然可以成功执行,这里...但是编译器它不是人,它只知道char型的指针可以直接赋值”,
  • 1、《程序员面试宝典》P67面试题3:内存地址“0x123456789”赋值为0,请写出代码。锐捷公司2007年的一道笔试题目 2、代码: #include<iostream> using namespace std; int main() { long *p;//这里...
  • 直接定义赋值都是没有问题的,正确的。...3.直接给指针赋值字符串。 4.先定义一个指针(也叫野指针,没有指向的空间),再赋值字符串。此时需要给指针先malloc给空间,让指针指向这个malloc开辟的空.
  • 由警告可知,array 和&array[0] 是int(*)[2] 型的指针 和int** 型的指针直接肯定不能赋值,所以  //int **dp = array; //int **dp = &array[0]; 这两种写法都是不对的, 如果有上面的两种赋值,编译时,...
  • c中字符数组,字符串指针赋值的方法总结

    万次阅读 多人点赞 2018-01-12 10:22:48
    在写程序的时候,总是搞混,现在总结一下以免以后...1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个赋值 char
  • 在本文中,我们主要介绍指针二维的内容,自我感觉有个不错的建议和大家分享下 #include <stdio.h> extern void print_double_point_address_value_p(int **p, int *p1); void main(){ int array[3][2] = {...
  • 起因是我看别人代码发现了那么一段程序,就是...”abcde”应在常量储存区,这个区的地址居然也能直接赋值?于是做了 如下探究 首先先看,p是否真的在常量储存区 char *p = "Hello"; char *q = "Hello"; cout (void
  • 使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针(写入地址值)、访问指针变量中可用地址的值(读出地址值)。三、代码演示3.1 定义一个指针变量定义指针变量时,要...
  • 理解指针之间的赋值

    千次阅读 2019-05-30 12:41:14
    平时我们操作链表的时候,通常把第一个节点head赋值给一个临时指针temp,如果通过临时指针temp来改变下一个节点,比如说temp直接指向链表的第三个节点,那么head的下一个节点是原链表的第二个节点还是第三个节点呢...
  • 在学习视觉14讲的点云拼接时碰到了以下问题: unsigned int d = depth.ptr <unsigned short> ( v )[u];... 一个指针赋值给了整型,是因为ptr是uchar*的指针,所以可以直接输出所指的对象吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,283
精华内容 513
关键字:

给指针直接赋值