Linux下C测试多个*两个const

 

在linux下的gcc测试当类型中有多个*时,

最多两个const不会出现警告并且必须格式TYPE *const*const p=&a;

警告 const TYPE**p; TYPEconst**const p=&a;const TYPE **cosnt p=&a;TYPE *const*const*const*const*const..p;

且由后面两个警告得TYPEconst**const p=&a;和const TYPE **cosnt p=&a;等效。

只要不出错,警告出来的一般可以运行(但是是破坏性的)。

推测TYPE const*const*const*const*const*const p=&a;由const依次得到对应类型

TYPE、TYPE*、TYPE**、TYPE***、TYPE****、TYPE*****,显然对应的这些被限定为不可赋值.当然一些const可能不会有。

因此我觉得TYPEconst*const p=&a;写成这样会好理解。

--------------------------以下全部在Linux下,使用的是gcc

正确(两个**两个const)

//编译 gcc const.c
//运行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 TYPE *const*const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 **p=A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}

[ pcdtest]$ ./a.out
memory**:0x7fffa4714d90 memory*:0x7fffa4714d98  data:321
memory**:0x7fffa4714d90 memory*:0x7fffa4714d9c  data:453
memory**:0x7fffa4714d90 memory*:0x7fffa4714d9c  data:321
正确(三个星两个const)

//编译 gcc const.c
//运行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE **A3=&A2;
 TYPE **const*const p=&A3;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 A2=&A11;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 ***p=A1;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 return 0;
}


**********************************以下两个警告,可以看到TYPE const**const p=&A2;和const TYPE**const p=&A2;等效均会造成警告。

const_.c: In function ‘main’:
const_.c:12: 警告:从不兼容的指针类型初始化
[ pcdtest]$ ./a.out
memory**:0x7fff0097c300 memory*:0x7fff0097c308  data:321
memory**:0x7fff0097c300 memory*:0x7fff0097c30c  data:453
memory**:0x7fff0097c300 memory*:0x7fff0097c308  data:321

 

//编译 gcc const.c
//运行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 TYPE const* *const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 *p=&A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}


 

//编译 gcc const.c
//运行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 const TYPE **const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 *p=&A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}

*************************************

最后给个字符串的

警告:

const_.c: In function ‘main’:
const_.c:10: 警告:初始化丢弃了指针目标类型的限定

//编译 gcc const.c
//运行 ./a.out
#include<stdio.h>
#include<string.h>
typedef char* TYPE;
int main()
{
 TYPE ca2="_before_me";
 const TYPE ca="me";
 TYPE  *const p=&ca;
 TYPE caf="afterme";
 printf("memory:%p data:%s\n",&ca2,ca2);
 printf("memory:%p data:%s\n",p,*p);
 printf("memory:%p data:%s\n",&caf,caf);
 //破坏性使用
 *p="hello_word";
 printf("memory:%p data:%s\n",&ca2,ca2);
 printf("memory:%p data:%s\n",p,*p);
 printf("memory:%p data:%s\n",&caf,caf);
 printf("memory:%p data:%s\n",&ca,ca);
 return 0;
}

打印结果:
memory:0x7fff719439d0 data:_before_me
memory:0x7fff719439c8 data:me
memory:0x7fff719439c0 data:afterme
memory:0x7fff719439d0 data:_before_me
memory:0x7fff719439c8 data:hello_word
memory:0x7fff719439c0 data:afterme
memory:0x7fff719439c8 data:hello_word

Linux内核中,I2C适配器是通过i2c_add_adapter()函数进行注册的。要注册两个I2C适配器,可以按照以下步骤进行操作: 1. 在驱动程序中定义两个i2c_adapter结构体变量,例如: static struct i2c_adapter i2c_adapter1 = { .owner = THIS_MODULE, .class = I2C_CLASS_HWMON, .algo = &i2c_algorithm, .name = "i2c_adapter1", }; static struct i2c_adapter i2c_adapter2 = { .owner = THIS_MODULE, .class = I2C_CLASS_HWMON, .algo = &i2c_algorithm, .name = "i2c_adapter2", }; 2. 在驱动程序的probe函数中,调用i2c_add_adapter()函数,将两个i2c_adapter结构体变量注册为I2C适配器。例如: static int my_driver_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; /* Register i2c_adapter1 */ ret = i2c_add_adapter(&i2c_adapter1); if (ret) return ret; /* Register i2c_adapter2 */ ret = i2c_add_adapter(&i2c_adapter2); if (ret) goto error_unregister_adapter1; /* Do other initialization */ return 0; error_unregister_adapter1: i2c_del_adapter(&i2c_adapter1); return ret; } 3. 在驱动程序的remove函数中,调用i2c_del_adapter()函数,注销已注册的I2C适配器。例如: static int my_driver_remove(struct i2c_client *client) { /* Do cleanup */ /* Unregister i2c_adapter2 */ i2c_del_adapter(&i2c_adapter2); /* Unregister i2c_adapter1 */ i2c_del_adapter(&i2c_adapter1); return 0; } 注意,如果两个I2C适配器共享同一个I2C控制器,需要在i2c_algorithm中实现多主机协议(Multi-Master Protocol)来保证通信的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值