1、关于int和char转换问题
#include<stdio.h>
#include<string.h>int main()
{
char str[512];
int i;
for(i=0;i<512;i++)
str[i]=-1-i;
printf("%d\n",strlen(str));
return 0;
}
解释:
因为在str的时候-1和是整数,默认按32位走,左边高地址,右边低地址
因为char只会读取一字节,只会读一字节
-1-0补码 1111 1111 1111 1111 1111 1111 1111 1111-0000 0000 0000 0000 0000 0000 0000 0000
结果str[0]=(补码1111 1111)-1
-1-255的时候,补码1111 1111 1111 1111 1111 1111 1111 1111-0000 0000 0000 0000 1111 1111
结果str[255]=(补码0000 0000)为0,因为存进char类型,所以变为‘\0'结束符号,所以最后strlen结果为255
2、关于二维数组问题
#include<stdio.h>
int main()
{
int nums[5]={2,4,6,8,10};
int *ptr=(int *)(&nums+1);
printf("%d,%d\n",*(nums+1),*(ptr-1));
return 0;
}
结果 4,10
&nums是代表整个数组的地址,所以进阶单位是整个数组长度
&nums+1就到达了10后面的一个位置
当*ptr=nums+1只是nums向后移动一个单位到达nums[1]
注意:&nums类型是int(*)[5]类型,要强制转换一下才可以
int *ptr=(&nums+1)不用强制转换的时候仍然代表一个的是10后面的一个位置,但是最后结果时ptr-1是按照int的字节减去,所以此时进阶单位不是一个数组长度
3、返回函数指针的函数
#include<stdio.h>
#include<string.h>
size_t q(size_t b)
{
return b;
}
size_t(*p(char *str))(size_t a)//返回函数指针的函数
{
printf("%s\n",str);
return q;//*q就是变成了q(size_t b)来计算
}
int main()
{
char str[]="xiyoulinuxgroup";
printf("%d",p(str)(strlen(str)));
return 0;
}