1 x86小端模式下
int a = 0x123456;
char *p = &a;
*(p+1) 的值0x34,因为p指向的是变量a内存单元最小地址处,char型指针指向的是一个字节的空间所以char型指针+1移动8位,int型指针指向的是4个字节的空间所以int型指针+1移动32位。
2 x86小端模式下 (str指向的是数组内存单元最小地址处)
char str[] ="123456789";
*(char *)((short*)str+2))的值是‘5’
int a = 0x123456;
char *p = &a;
*(p+1) 的值0x34,因为p指向的是变量a内存单元最小地址处,char型指针指向的是一个字节的空间所以char型指针+1移动8位,int型指针指向的是4个字节的空间所以int型指针+1移动32位。
2 x86小端模式下 (str指向的是数组内存单元最小地址处)
3 char *p;p是一个变量,这个变量的值是一个地址,占4个字节
p = (char *)malloc(sizeof(char) * 10);系统开辟了一块内存,将内存的地址放到p,p这个变量此时的值就是新内存的地址了。
char **q;
*q = (char *)malloc(sizeof(char) * 10);*q就是p变量的值,只要p变量的值变了就ok了
下段代码的运行结果:
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答:2,5
*(a+1
)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
a,&a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
4 typedef struct
{
char * name;
}P;
P *p = (P*)malloc(sizeof(P));这里开辟的空间只是给变量name开辟了4个字节用来放后来开辟的地址
p -> name = (char *)malloc(sizeof(char *) * 10);
5 int a = 5;b = 3;
if(!a && b++){}
这时候a的值是5b的值是3.为什么呢。因为!a的值是0了,那么!a && b++的值就已经确定了,不会再执行b++了。
6 变成风格:
if( “a" ==i ){ a++ ;}这种风格较好:因为如果把"a" == i写成"a" = i的话编译器会自动报错,因为不能给常量赋值呀。
7 int a的bit3位置1,也就是第四位
a |= (0x1 << 3)
8
char *str = "hello world!";
char *s = (char *)malloc(sizeof(char) * 20);
memset(s, 0, sizeof(s));
char *ss = s;//知道为什么这么写嘛。s指向的一整块内存。不能s++遍历。
char *s = (char *)malloc(sizeof(char) * 20);
memset(s, 0, sizeof(s));
char *ss = s;//知道为什么这么写嘛。s指向的一整块内存。不能s++遍历。
assert(s && str);
while(*str)
{
*ss++ = *str++;
}
*ss = *str;//for '\0'
printf("%s\n", s);
while(*str)
{
*ss++ = *str++;
}
*ss = *str;//for '\0'
printf("%s\n", s);
9
char buf[10] = "123456789";
int *p = (int *)buf;
printf("%d\n", *(buf + 1));buf一次指向一个字节的内存,要把这一个字节的内容'2'以%d的形式打印出对应的ASCII值(也就是说char型'2'与int型50在内存中二进制值是一样的)
printf("%d\n", *(p + 1));p一次指向4个字节的内存,要把这4个字节的内存"5678"以%d的形式打印出
int *p = (int *)buf;
printf("%d\n", *(buf + 1));buf一次指向一个字节的内存,要把这一个字节的内容'2'以%d的形式打印出对应的ASCII值(也就是说char型'2'与int型50在内存中二进制值是一样的)
printf("%d\n", *(p + 1));p一次指向4个字节的内存,要把这4个字节的内存"5678"以%d的形式打印出