簡體   English   中英

“ unsigned int * ptr”和“ signed int * ptr”有什么區別?

[英]what is the difference between “unsigned int *ptr” and signed int *ptr"?

我知道整數指針將取消引用4個字節,然后對指針進行有符號和無符號處理? “ unsigned int * ptr”和“ signed int * ptr”是什么意思

指針類型表明它可以保留什么樣的變量地址。 因此, unsigned int *ptr應該保留unsigned int地址,而signed int *ptr應該保留signed int地址。

請看下面的代碼,

  int main()
  {
    unsigned int * ptr1;
    signed int * ptr2;

    unsigned int i;
    signed int s;

    ptr1 = &s;
    ptr2 = &i;

  }

它給我以下Visual Studio中的錯誤,

錯誤1錯誤C2440:'=':無法從'int *'轉換為'unsigned int *'[...]

錯誤2錯誤C2440:'=':無法從'unsigned int *'轉換為'int *'[...]

當你有

unsigned int* ptr;

假定ptr的值包含一個unsigned int 同樣,當你有

signed int* ptr;

假定ptr的值包含一個有signed int

這是一個簡單的實驗:

#include <stdio.h>

int main()
{
   signed int i = -10;
   signed int* p1 = &i;
   unsigned int* p2 = (unsigned int*)p1;

   printf("Value of p1: 0x%p\n", p1);
   printf("Value of p2: 0x%p\n", p2);

   printf("Value of *p1: %d\n", *p1);
   printf("Value of *p2: %u\n", *p2);
}

該程序的示例輸出:

Value of p1: 0x0x7fff1b52bd6c
Value of p2: 0x0x7fff1b52bd6c
Value of *p1: -10
Value of *p2: 4294967286

即使p1p2所保存的地址的數值相同,但在取消引用時,它們的取值也大不相同。

在C / C ++中,指針不過是一個內存位置。 對於給定的體系結構,它們的大小是相同的。 指針的類型(例如void *,int *,unsigned int *等)告訴編譯器如何處理指針數學。

以這種方式可視化始終對我有幫助...

char *ptrMyString = "test";
int *ptrMyINTS[] = {1,2,3,4}

上面每個數組的內存如下所示:

Offsets        0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
ptrMyString = [t] [e] [s] [t] [0]
ptrMyINTS   = [0] [0] [0] [1] [0] [0] [0] [2] [0] [0] [0] [3] [0] [0] [0] [4]

sizeof(ptrMyString)應該等於sizeof(ptrMyINTS),因為它們只是內存指針。 但是,ptrMyString ++將增加1,而ptrMYINTS將增加4。

現在,我已經簡化了很多事情,並忽略了諸如虛擬內存之類的東西,但是基本思想是,例如,如果兩個指針都從0x00000000(32位地址)開始,則每個偏移量的指針值將為:

ptrMyString+0 = 0x00000000 = t
ptrMyString+1 = 0x00000001 = e
ptrMyString+2 = 0x00000002 = s
ptrMyString+3 = 0x00000003 = t

ptrMyINTS+0 = 0x00000000 = 1
ptrMyINTS+1 = 0x00000004 = 2
ptrMyINTS+2 = 0x00000008 = 3
ptrMyINTS+3 = 0x0000000C = 4

注意,所有位置的大小都相同,但我們增加的數量1和4分別來自指針的類型char *和int *。 我假設這里的int為4字節,因為它位於32位X86和ARM體系結構上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM