您的位置:首页 > 其它

联合 枚举 双指针 万能指针void*

2016-08-24 18:51 211 查看

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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息