void真正发挥的作用在于:对函数返回的限定;对函数参数的限定。
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“ ‘=’:cannot convert from 'int *' to 'float *' ",需要改为:
p1 = (float *)p2;
然而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但是下面语句却是错的:
void *p1;
int *p2;
p2 = p1;
void* 需要进行强制类型转换再赋给其他指针。
按照ANSI标准,不能对void指针进行算法操作:
void * pvoid;
pvoid ++; //ANSI:错误
pvoid += 1; //ANSI:错误
但在GNU编译器中是正确的
因此在实际的程序设计中,为符合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
void * pvoid;
(char *)pvoid++;
(char *)pvoid += 1;
柔性数组
typedef struct st_type
{
int i;
int a[0];
}type_a;
有些编译器会报错无法编译,可以改成:
typedef struct st_type
{
int i;
int a[];
}type_a;
这样我们就可以定义一个可以变长的结构体,用sizeof(type_a)得到的只有4,就是sizeof(i)=sizeof(int)。0个元素的数组没有占用空间,而后我们可以进行变长操作。通过如下表达式给结构体分配内存:
type_a * p = (type_a *) malloc (sizeof(type_a ) + 100 * sizeof(int));
用p->item[n]就能简单地访问可变长元素。但是再用sizeof(*p)测试结构体的大小,发现还是4。
测大小端
int checkSystem()
{
union check
{
int i;
char ch;
}c;
c.i = 1;
return (c.ch == 1);
}
在X86系统下,以下程序输出值为多少?
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf ("%x, %x",ptr1[-1],*ptr2);
return 0;
}
输出值为5,2。
typedef struct student
{
//code
}Stu_st,* Stu_pst;
1、struct studebt stu1 和 Stu_st stu1 没有区别
2、struct studebt *stu2、Stu_pst stu2 和 Stu_st *stu2 没有区别
3、const Stu_pst stu3; const修饰的是stu3这个指针
4、Stu_pst const stu4; const修饰的是stu4这个指针
字符在内存中是以ASCAII码存储的,所以字符常量可以与整形常量或变量进行运算,
如:'A' + 1
按位异或操作可以实现不用第三个临时变量交换两个变量的值: a ^= b; b ^= a; a ^= b;