p1=&a;
p2=&b;
*p1=*p2;(代表a=b,a=20)
p1=p2;(代表指向变了,p1指向b,a的值没发生改变,p1=20,p2=20,a=10,b=20)
2. fgetc(文件):从文件读一个字符
fputc(字符,文件):将字符写入文件
3. 给指针变量赋值前必须&,让其指向一个空间。
例:int *p,n;
p=&n;
scanf(“%d”,p);
4. 字符数组必须初始化必须声明时就初始化。
例:char s[3]={“abc”};
(下面的是错误的)
char s[3];
s[]={“abc”};
5. 字符指针可以声明时初始化,也可以另起一条语句。
例:char *s=”abc”;
或:char *s;
s=”abc”;
6. main函数的正确说明形式:
int main(int argc,char *argv[]);
int main(int argc,char *[]argv);
int main(int argc,char **argv);
(argc:参数个数,argv:参数)
7. 指针函数与函数指针:
(1)指针函数:
类型标识符 *函数名(参数表)
Int *fun(int x,int y)
指针函数是指带有指针的函数,即本质是一个函数,函数的返回类型是某一类型指针(返回值是地址)。
(2)函数指针:
函数指针是指向函数的指针变量,即本质是一个指针变量。
类型标识符 (*指针变量名)(参数表)
int max(int x,int y)
{
…… //函数体
}
Int main()
{
Int (*p)(int ,int); //声明一个函数指针
p=max; //函数指针指向该函数
(*p)(a,b); //调用该函数
……
return 0;
}
8. 若要对a进行++运算,要求a不能为数组名,以下都不可以
int a[3][2]; //普通二维数组
char *a[]={“abc”}; //指针数组
指针可以进行++运算
9. 指针数组与数组指针:
(1) 指针数组:
char *n[]={“gain”,”much”,”strong”};
n[1]代表much的地址,*n[1]代表字符m(%s,n[1]输出much)(%c,*n[1]输出m)
数组元素也为指针,本质是一个数组。
(2) 数组指针:
Int (*a)[N];
a指向包含N个元素的数组,本质是一个指针
10. 指针变量运算时,
(1) 重新赋值(数值)会改变指针指向变量的值
例:int a=5,*p=&a;
*p=10;
那么a最后等于10
(2) 重新指向(将地址赋给指针)不会改变原先指针指向的变量的值
例:int a=5,b=6,*p=&a;
*p=&b;
*p由原先的5变为6,而a还是5
11.int a[]={10,20,30},*p=a;
p++;
p向高地址移了一个存储单元,也就是向高地址移了两个字节,移动的字节数取决于p指向元素的类型。
11. int a[5][5],*p=a;
表示a[1][2]元素:
*(*(a+1)+2),*(*(p+1)+2),a和p用法一样
a+1=&a[1] ,*(a+1)=a[1], a[1]+2=&a[1][2], *(a[1]+2)=a[1][2]
12. malloc函数和calloc函数
(1) malloc函数:
声明一个struct p型的内存
struct p *pr=(struct p*)malloc(sizeof(struct p));
malloc在动态分配完内存后,内存空间不初始化,里边数据都是随机产生的垃圾数据
(2) calloc函数:
声明一个int型的10个元素的数组
int *p=(int *)calloc(10,sizeof(int));
calloc在动态分配完内存后,自动初始化该内存空间为零
caoolc分配的是指针,但用法和数组一样。
例:
#include
void main()
{
int *p=(int *)calloc(10,sizeof(int));
int i;
for(i=0;i<10;i+=2)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&p[i]);
}
for(i=0;i<10;i++)
{
printf("%d\n",p[i]);
}
}