1.联合
1.1 联合是程序员自己创建的一种数据类型
typedef union U{ //联合中的所有成员变量共用一块存储空间
int x;
int y;
int z;
};
...
U u1;
NSLog(@"%lu",sizeof(u1));
u1.x=10;
NSLog(@"%d,%d,%d ",u1.x,u1.y,u1.z); //(输出结果:10,10,10)其他两个也会为10
...
typedef union {
char ch[4];
int x;
}Data;
...
Data d;
d.x=0x41424344; //每两个16进制数占4个字节,按小端存储 。
for(int i=0;i<4;i++){
printf("%c ",d.ch[i]); //ASCLL码, 输出结果(D C B A)
}
printf("\n");
...
2.枚举
2.1 也是程序员自己创建的一种数据类型
typedef enum{
MONDYA=100,TUESDAY,WEDNESDAY,THURDAY=200,FRIDAY,SATURDAY,SUNDAY,
}Weed; //常量必须为整数,可以指定值,不指定的值按前边指定的值依次+1;
void show(Weed type){
switch (type) {
case MONDYA: //增加代码可读性
NSLog(@"星期一");
break;
case TUESDAY:
NSLog(@"星期二");
break;
case WEDNESDAY:
NSLog(@"星期三");
break;
case THURDAY:
NSLog(@"星期四");
break;
case FRIDAY:
NSLog(@"星期五");
break;
case SATURDAY:
NSLog(@"星期六");
break;
case SUNDAY:
NSLog(@"星期日");
break;
}
int main()
{
@autoreleasepool {
NSLog(@"%d",MONDYA); /
NSLog(@"%d",TUESDAY);
NSLog(@"%d",SUNDAY); // 输出结果(100 101 203)
show(MONDYA); //输出结果 (星期一)
}
return 0;
}
3.双指针
3.1 指针的指针
3.2 值传递的本质是在函数体内修改形参本身
3.3地址传递的本质是在函数中修改形参指向的变量
void get(char** str)
{
*str ="abcd";
}
int main()
{
@autoreleasepool {
int x=10;
int* px=&x;
int** ppx=&px;
**ppx=20;
NSLog(@"%d",x); //输出结果(20)
char *msg=nil;
get(&msg);
printf("%s\n",msg); //输出结果(abcd)
}
return 0;
}
4.万能指针void*
4.1 万能指针,可以指向任意类型的变量,
4.2 在使用时,需先将其转换回指向的变量的类型
int main()
{
@autoreleasepool {
int x=10;
int *px=&x; //同一类型的指针只能指向同一类型的变量
NSLog(@"%d",*px);
double *pd=&x; //不用类型的指针,不能指向不同的类型的变量
NSLog(@"%lg",*pd); //输出垃圾值
void *p=&x; //定义万能指针
double d=3.14;
p=&d; //void* 类型的指针可以指向任意类型的变量
NSLog(@"%lg",*(double *)p); //万能指针在引用其指向的变量时,需先将其转换回指向的变量的类型
}
return 0;
}
//编写一个函数,用万能指针做形参,打印任意类型的变量值
typedef enum{
INT,FLOAT,DOUBLE,CHAR,
}Type;
void print(void *p,Type type){
switch (type) {
case INT:
NSLog(@"%d",*(int*)p);
break;
case FLOAT:
NSLog(@"%g",*(float*)p);
break;
case DOUBLE:
NSLog(@"%lg",*(double*)p);
break;
case CHAR:
NSLog(@"%c",*(char*)p);
break;
}
}
int main()
{
@autoreleasepool {
int a=10;
char b='a';
float c=3.14;
print(&a,INT);
print(&c, FLOAT);
print(&b,CHAR);
}
}