C语言复杂表达式,指针高级运用

1
指针数组是数组
数组指针是指针:指针指向的是一个数组。


分析:
int *p[5];
int (*p)[5];
int *(p[5]);//和第一个是一样的,小括号是多余的,用了也没错。
第一步找核心:定义的符号是谁
第二步找结合:如果核心和*结合,表示指针;如果核心和【】结合,表示数组;如果核心和()结合,表示是函数。
第三步向外扩展:找到核心后,从内到外逐层的进行结合
2函数指针:
函数指针本质是指针,本身还是占4字节,所有指针都是4字节。
函数本质是一段在内存中连续分布的代码,C语言用函数名来表示函数首地址


C语言是强类型语言(每个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查。


函数名与数组名最大区别:函数名做右值时加不加&效果和意义都是一样的;但是数组名是有区别的
3

struct student{
           int age;
           char name[20];
        };//此时定义了一个类型,不耗内存。
        struct student s1;  //此时定义了一个结构体变量,需要分配内存。


typedef struct student{
int age;
           char name[20];
}student;  //此时定义了两个相同类型,但是不同名字的类型。一个是struct student;一个是student.


注意: typedef int *PTNT; const PTNT p2; 相当于是int *const p2;
               typedef int *PTNT;  PTNT const p2; 相当于是int *const p2;


4二重指针:
二重指针与一重指针没有本质区别,都是指针变量,都占4个字节。


char **p1;
char *p2;
char a;
p2=&a;
  p1=&(&a);//报错:因为&a是一个常量,不能对常量再使用&;
p1=&p2;//没错:因为p2是一个char *指针变量,可以使用&;


二重指针指向一重指针的地址;

猜你喜欢

转载自blog.csdn.net/qq_32809273/article/details/53284345