【C++】空指針的理解


 

空類型指針(void *)的理解_手寫的從前66的博客-CSDN博客_空類型指針

void指針是空類型指針,它不指向任何類型,即void指針僅僅是一個地址,所以空類型指針不能進行指針運算,也不能進行間接引用(因為指針運算和間接引用都需要指針的類型信息)。

例如: void * p; //僅僅表示p存放一個地址

       p++;         //error:+、-運算離不開指針類型

       *p=20.5;     //error:訪問p指向的變量空間需要變量類型信息

  

由於其他指針都包含有地址信息,所以將其他指針的值賦給空類型指針是合法的;反之,將空類型指針賦給其他指針則不被允許,除非進行顯式轉換。

例如: int a=20;

      int* ptr=&a;

      void *p=ptr;      //OK 將整型指針值賦給空類型指針

      ptr=p;            //error 不能將空類型指針賦給其他指針

      ptr=(int*)p;    //OK 顯式轉換

 

可以作為函數形參,在使用時進行顯式轉換。

 

【面試題】實現memcpy函數 - 戀戀美食的個人空間 - OSCHINA - 中文開源技術交流社區

盡管該鏈接說memcpy這個函數

If copying takes place between objects that overlap, the behavior is undefined.

對於地址重疊的情況,該函數的行為是未定義的。

但是在VS2019中運行的時候,發現下面代碼中

memcpy(buf+2, buf, 5);
//Memcpy(buf + 2, buf, 5);

的運行結果是一樣的。所以該函數可能已經經過改寫不再具有上述問題。

 

測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void* Memcpy(void* dst, const void* src, size_t size);

int main(int argc, char* argv[])
{
    char buf[100] = "abcdefghijk";
    memcpy(buf+2, buf, 5);
    //Memcpy(buf + 2, buf, 5);
    printf("%s\n", buf + 2);

}

void* Memcpy(void* dst, const void* src, size_t size)
{
    char* psrc;
    char* pdst;

    if (NULL == dst || NULL == src)
    {
        return NULL;
    }

    if ((src < dst) && (char*)src + size > (char*)dst) // 自后向前拷貝
    {
        psrc = (char*)src + size - 1;
        pdst = (char*)dst + size - 1;
        while (size--)
        {
            *pdst-- = *psrc--;
        }
    }
    else
    {
        psrc = (char*)src;
        pdst = (char*)dst;
        while (size--)
        {
            *pdst++ = *psrc++;
        }
    }

    return dst;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM