“unsigned int * ptr”和signed int * ptr“之间有什么区别?”

时间:2014-04-26 04:06:53

标签: c linux

我知道整数指针会取消引用4个字节,然后使用指针进行有符号和无符号的操作吗? " unsigned int * ptr"是什么意思?和"签署了int * ptr"

3 个答案:

答案 0 :(得分:3)

指针类型表明它可以保留哪种变量。因此,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 *'[...]

答案 1 :(得分:1)

当你有

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所占地址的数值相同,但在取消引用时,它们会评估到非常不同的值。

答案 2 :(得分:0)

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体系结构上。