类型 定义方式
指针数组 :由指针构成的数组 int *array[3]; array先于【3】结合成为数组
数组指针 :指向数组的指针 int (*array)[3] ; array先于*结合成为指针
指针函数 :能返回指针类型的函数 int * fun( int,int) ; fun先于()结合成为函数
函数指针 :指向函数的指针 int (*fun)( int,int ); fun先于*结合成为指针
指针数组用处:常用于保存字符串
int num1=20,num2=30,num3=40;
int *array[3]={ &num1,&num2,&num3}; //容易理解的定义
char *name[4]={"you","are","good‘,"boy"} //常用
printf("%s", name[2]) //直接打印name[2]内容good,name[2]=*(name+2)
sizeof(name) //抓取整个数组内存字节数
sizeof(char*) //抓取char类型指针变量内存字节数
数组指针用处:常用于对应二维数组或作为形参接受二维数组
int array[2][3]={ {1,3,5},
{11,33,55}};
int (*arr)[3] ; //后面[3]就代表列
arr=array; //arr指向了数组首地址
printf("%d", *( *(arr+i) +j) ); // 打印内容格式,i代表行,j代表列
指针函数用处:使子函数能直接返回指针被主函数接受
char *fun( )
{
char str[50]={"nihao"}; //不正确,str存在动态区
char static str[50]={"nihao"}; //正确,加static修饰词后,str存储在静态区
return str;
}
int main()
{
char *pum;
pum=str; //能直接接受返回值
printf("%s", pum); //打印字符串时,%s接收的是首地址
return 0;
}
函数指针用处:能够用于被调函数的形参,接受任意函数,从而被调函数可以实现任意函数功能
int jia(int x,inty)
{}
int jian(int x,int y)
{}
int process( int (*fun)(int x,int y),int x,int y) //形参可以接受函数名
{}
int main()
{
int cons;
cons=process( jia ,3,2); // 通过process函数接受jia函数,实现jia函数功能
return 0;
}
只读指针变量 :int *pum=&a; 现在pum可以更改指向地址
int * const pum=&a; 从const向左看先与*结合,则pum只能指向a的地址,不 能再更改其指向的地址,但可以更改指向地址的内容
只读变量指针 :int const *pum=&a 从const向左看先与Int结合,则pum指向的地址中的内 容它无权更改,但可以更改其指向的地址
习题; 十进制转二进制,并考虑正负
#include <stdio.h>
void count(int array[] ,int x);
int main()
{
int i;
int array[64]={0};
count(array,64);
return 0;
}
void count(int array[], int x)
{
int num,i;
char ch;
printf("请输入一个数字,加上正负号\n");
ch=getchar();
scanf("%d", &num);
for(i=63;i>=0;i--)
{
array[i]=num%2; //将输入的数不考虑正负先用对2取余的方法转为2进制
num/=2;
}
if(ch=='+')
;
if(ch=='-') //判断正负
{
for(i=63;i>=0;i--)
{
if(array[i]==1)
array[i]=0; //将负数的0,1反转
else
array[i]=1;
}
for(i=63;i>=0;i--)
{
if(1==array[i]) //反转后加1
array[i]=0;
else
{
array[i]=1;
break;
}
}
}
for(i=0;i<64;i++)
printf("%d", array[i]);
}