指针*p与地址之间的关系

 结论:逻辑内存中,每个字节对应一个地址,也就是每个字符对应一个地址,一个int型的变量由于是4个字节,就会对应4个地址。我们只有取到整型的首地址才能得到完整的int型数据

   二.理解为什么char*可以这样char *str =”char test”直接赋值,int型的指针不能直接int *a = {1,2,3}赋值

          给指针赋值就是让其指向一个地址。对于char *str = “abc”;本质是在内存常量区生成一个区域存放"abc"字符,而且这个区域是不可以修改的,不受用户控制,而str就是指向的这个地址,所以相当于const char *str,无法修改这个地址的变量。

我们进一步看,str指向的是一个字符串,所以给其赋值一个字符串是合理的,而且这些字符串中的字符都是连续的。而对于int型的指针,指向的是一个数,如果直接把好几个数赋值给指针,那么指针指向的应该是谁?如果你想说可以指向一堆连续存放的数,那么我告诉你,这个交给数组就可以了。你可以先声明一个数组,然后把数组的首地址给int*指针,这样就实现了让指针指向一个数组。

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

static char buff[10]={1,2,3,4,5};  
static int  temp[10]={65656565,32323232,8,9,10};  

typedef union
{
char id_byte[4];
int  id_word;
}id_card_t;

int main(int argc, char *argv[]) 
{  
    id_card_t idc;
    idc.id_word = 0x12131415;
    //int word = 0x22232425;
    int word;
    *(int*)&word = 0x22232425;   //知道地址然后对其赋值 
    
    id_card_t *p3 = (id_card_t*)temp;
    
char *p1 = ( char *)buff;
int *p2 = ( int *)temp;

//char *p4 = (char *)&idc;
char *p4 = (char*)&word;


printf("data1 %d\n",*(char*)buff); //1
printf("data2 %d\n",*(int*)temp);  //65656565

p2++;  // 相当于char += 4; /*为什么指针加一,地址不一定加一*/
    printf("data2 %d\n",*(int*)p2);   //32323232
    printf("id_card_t %d\n",*(id_card_t*)p3); //65656565


  //  printf(" %x\n",*(char*)word);  //报错 
    printf(" %x\n",*(char*)p4++);           //25
        printf(" %x\n",*(char*)p4++);       //24
            printf(" %x\n",*(char*)p4++);   //23
                printf(" %x\n",*(char*)p4); //22
    
    printf("sizeof(p3) %d\n",sizeof(p3));   //4   64位是8Byte 
    printf("sizeof(p4) %d\n",sizeof(p4));   //4


return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值