对象名称 | 对象类型 | 占存储空间 | 地址范围 | 首地址 |
变量n | int | 4字节 | 1000~1003 | 1000 |
变量f | fioat | 4字节 | 1006~1009 | 1006 |
数组n | int | 8字节 | 1014~1021 | 1014 |
数组c | char | 3字节 | 1028~1030 | 1028 |
指针变量:
1.声明指针变量:
int *p; char *q;
2.对指针变量赋值:
①在声明阶段赋值
int n[4]={76,83,90},*p=&n[0]; float f=2.75,*q=&f; char c[3]={'a','b','c'},*t=&c[0];
②声明阶段不赋值,在语句代码阶段赋值
int n[4]={76,83,90},*p; float f=2.75,*q; char c[3]={'a','b','c'},*t; p=&n[0]; q=&f; t=&c[0];
2.通过指针访问变量
int a=100; int *p; p=&a; printf("*p=%d\n",*p);
3.指针与数组
数组名与数组首地址
int a[5]={10,15,20,25,30}; int *P,*q; p=a; q=&a[0]; //p=&a[0]意为P取数组下标为0的第一个元素的地址;而q=a意为q取名为a的数组的首地址,
printf("*p=%d,*q=%d\n",*p,*q);
4.指针的运算
#include<stdio.h> void main(){ int a[5],*p=a; printf("请输入5个任意整数到数组中:"); for(int i=0;i<=4;i++) scanf("%d,",&a[i]); printf("现将指针p指向数组a的首地址,则\n"); p=p+0; printf("指针p=p+0后指向的元素是:%d\n",*p); p=p+4; printf("指针p=p+4后指向的元素是:%d\n",*p); p=p-2; printf("指针p=p-2后指向的元素是:%d\n",*p); } 指针p=p+0后指向的元素是:10 指针p=p+4后指向的元素是:30 指针p=p-2后指向的元素是:20
5.指针变量之间的比较
①若p==q为真,表示p,q指向数组的同一元素
②若p<q为真,表示p所指的元素在p所指的元素之前
③若p>q为真,表示p所指的元素在q所指的元素之后
6.通过指针访问一维数组
#include<stdio.h> void main(){ int a[5]={15,20,25,30,35}; int *p; int i; p=a; for(i=0;i<5;i++) printf("a[%d]=%d\n",i,*(p+1)); } a[0]=15 a[1]=20 a[2]=25 a[3]=30 a[4]=35
注意:(1)*(p+i)不能写成*p+1,前者是指取地址p+1指向的数据;后者是取地址为p所指向的数据,然后将数据 i 相加;
(2)因为指针变量可与整数做加、减法运算,因此2,循环及输出语句
写法一:
p=a; for(int i=0;i<5;i++) printf("a[%d]=%d\n",i,*p(p+1));
写法二:
p=a; for(int i=0;i<5;i++,p++) printf("a[%d]=%d\n",i,*p);
写法三:
p=a; for(int i=0;i<5;i++) printf("a[%d]=%d\n",i,*p++);
7.通过指针访问多维数组
声明和赋值:int a[3][4]={{1,2,,3,4},{5,6,7,8},{9,10,11,12}};
#include<stdio.h> void main(){ int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int *p; for(int i=0;i<3;i++){ p=a[i]; for(int j=0;j<4;j++){ printf("%3d",*(p+j)); /*访问数组元素*(a[i]+j)*/ printf("\n"); } } }
8.指针与字符串
#include<stdio.h> void main(){ char a[]="I am a boy."; char *p; p=s; printf("第一次输出字符数组s:%s\n",s); printf("第二次输出字符数组s:%s\n",p); p=p+5; printf("改变指针p指向后结果:%s\n",p); } 第一次输出字符数组s:I am a boy. 第二次输出字符数组s:I am a boy. 改变指针p指向后结果:a boy.
注意:①指针变量p指向字符串首地址输出时:printf(".............%s\n",p); 不能写成 :printf("..............%s\n",*p);
②“%s”格式符与“%c”格式符在字符串输出时的区别:“%s”格式符实现将当前字符串中指针p所指地碰到址之后字符串的整串输出,直到碰到“\0”为止;
而“%c”格式符则只是单个输出字符串中的某个字符。
补充:
void的真正含义为:(1)对函数返回的限定;(2)对函数参数的限定
如果函数没有返回值,那么应声明为void类型