静态变量分为局部静态变量和全局静态变量
局部静态变量不是全局变量
int *ptr[4]:ptr是数组,存放了4个指向int类型的指针
int **ptr:ptr是指向int类型指针的指针(是指针)
int (*ptr)[4]:ptr是指针,指向一个二维数组a[N][4],列数是4,行不知道。也称为行指针,*p指向第一行,*(p+1)指向第二行。
int ptr[4]:ptr是数组,存放了4个int类型变量
int *(ptr[4]):ptr是数组,存放了4个指向int类型的指针,可以将int *看做是一种类型。
char *p(char a[10]); 这样写的话,p虽然是函数名,但这样 是函数的声明形式,不是定义(没有函数体) 如果形式如下: char (*p)(char a[10]) 此时是定义一个函数指针,名为p
char *p(char a[10]);这是声明了一个返回为char *(字符指针)的函数,所以函数名是p是对的,不要和函数指针混淆,函数指针需要用括号括起来 char (*p)(char a[10]);该声明表达的为返回char类型,形参为char数组的函数指针
1、首先*s[10] 是一个指针数组,s 是一个含有10个指针的数组,故可以这样来看这条声明语句:假设 p 等价于 s[10],声明语句变为 int (*p)(int);
2、观察 int (*p)(int), 从名字开始,p前面有一个 * ,因此 p 是指针,有侧是形参列表,表示p指向的是函数,在观察左侧,函数返回的是 int;
3、则 int (*p)(int) 解读为:函数指针,指向一个 int func(int param) 的函数;
4、故 int (*s[10])(int) :解读为:函数指针数组,每个指针指向一个 int func(int param)的函数。
只有在使用时才为该类型变量分配内存的存储类型的是 auto,register
函数是一种特殊的数据类型
int (*p)(int ,int),p是个函数指针变量,它的类型其实就是函数类型
指针函数:当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 声明格式为:类型说明符 *函数名(参数)。比如: int * foo(int,int); 2.函数指针:指向函数的指针包含了函数的地址,可以通过它来调用函数。 声明格式:类型说明符 (*函数名)(参数)。比如:void (*fptr)();
数组名是一地址常量,数组名之间是不能彼此赋值的
可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度。
inta[ ][3]={1,2,3,4,5,6};
a数组的第一维的定义被省略,初始化数据共6个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。
一般,省略第一维的定义时,第一维的大小按如下规则确定:
初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。例如,inta[ ][3]={1,2,3,4};等价于:inta[2][3]={1,2,3,4};
若分行初始化,也可以省略第一维的定义。下列的数组定义中有两对{ },已经表示a数组有两行。
staticinta[ ][3]={{1,2},{4}};
不能省去的情况即为无法从初始化的数据个数和二维长度推断出一维长度的情况,例如没有给第二维长度的情况。