指针*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;
}

### C语言中指针变量普通变量的关系 在C语言里,普通变量用于存储数据值,而指针变量则专门用来存放其他变量的地址。这意味着通过指针可以间接访问并操作这些被指向的数据项。 当声明一个普通的整型变量`int a = 10;`时,在内存中有特定的空间分配给该变量以保存数值10。此相对应地创建一个指向相同类型的指针,则可以通过如下方式实现: ```c int a = 10; int *p = &a; ``` 这里`*p`表示这是一个指向整数(`int`)类型的指针,并且初始化为指向变量`a`的位置。因此,`p`本身存有`a`所在位置的信息而不是具体的数值[^3]。 ### 不同级别指针的区别 #### 单级指针(*p) 单星号(*)修饰符表明这是一阶指针,意味着它可以持有另一个对象(无论是基本类型还是复合结构体成员)的具体位置信息。例如上述代码片段中的`int *p=&a;`说明了这一点——`p`是指向整数的一个一维指针,能够获取或修改由它指示的那个具体位置上的实际内容。 #### 双重指针(**p) 双重星号(**)代表二阶或多层嵌套形式下的指针概念。这类指针不仅记录着某个地方的定位,而且那个地点还应该包含有一个更深层次的目标地址。简单来说就是一个“指向指针”的实体。考虑下面的例子: ```c int value = 20; int *singlePointer = &value; int **doublePointer = &singlePointer; printf("Value via single pointer: %d\n", *singlePointer); // 输出20 printf("Value via double pointer: %d\n", **doublePointer); // 同样输出20 ``` 在这个场景下,`**doublePointer`实际上最终指向的是最初定义好的`value`变量,但是路径上经过了一次额外层次的跳转过程。这种机制允许程序设计者构建更加灵活复杂的数据关联模式,比如动态数组管理或是链表节点间的连接等应用场合[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值