指针

指针

 

对象名称 对象类型 占存储空间 地址范围 首地址
变量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类型

 

上一篇:java面试题


下一篇:PAT1017