结论:逻辑内存中,每个字节对应一个地址,也就是每个字符对应一个地址,一个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;
}