小结1

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;

猜你喜欢

转载自blog.csdn.net/weixin_43664746/article/details/84842729