搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 学生成才 > 【C语言】10-指针

【C语言】10-指针

学生成才 2020-03-26

【C语言】10-指针

变量的指针和指向变量的指针变量


一、定义一个指针变量

1.定义的一般形式:基类型  *指针变量名; 

⊙基类型:用来指定指针变量可以指向的变量的类型。

                    将决定指针移动和运算时的移动量。构成:[存储类型]    数据类型

表示该变量为指针类型

例   int *p1,*p2;

       float   *q ;

       static  char  *name;

注意:

1、int   *p1, *p2;   与   int   *p1, p2;

2、指针变量名是p1,p2 ,不是*p1,*p2

3、指针变量只能指向定义时所规定类型的变量

4、指针变量定义后,变量值不确定,应用前必须先赋值


【C语言】10-指针

1.含义
2.两者关系:互为逆运算

3.理解

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针


三、指针变量的初始化

【C语言】10-指针

指针变量赋值:

int  i, j; 

int  *p1, *p2; 

p1=&i; p2=&j ; 

i=3; *p1=5; 

j=6; *p2=8;

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

四、指针变量的引用

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

1.特点:共享内存,“双向”传递 

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针


数组与指针


3.引用数组元素:

    ⑴下标法:a[3]

    ⑵指针法:用指针变量指向所找的数组元素。

            占内存少,运行速度快。


一、指向数组元素的指针

例:int a[10];

        int *p;

        p=&a[0];  或  p=a;   /*定义后赋值,两者等价*/

定义指针变量时赋初值:

例:int *p=&a[0];

        int *p=a;     

【C语言】10-指针


二、通过指针引用数组元素

如果:int a[10];

             int *p;

             p=&a[1];  /* p指向数组元素a[1] */

    则:*p=1

              表示对p当前指向的数组元素a[1]赋予值1

    而:p+1指向同一数组的下一个元素a[2]。

设  p=&a[0]

      ⑵ *(p+i)或*(a+i)是p+i或a+i指向的数组元素a[i]

      ⑶ 指向数组的指针变量可带下标,p[i]与*(p+i)等价

   

表示数组元素的两种方法:

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针


三、用数组名作函数参数

【C语言】10-指针


       例:将数组a中n个整数按相反顺序存放。

             思路:数组元素头尾对调。四种调用方式。

【C语言】10-指针


⑴ 实参与形参均用数组

#include <stdio.h>

void main()

{void inv(int  x[ ], int n);

  int i,a[10]={3,7,9,11,0,6,7,5,4,2};

  printf("The original array:\n");

  for(i=0;i<10;i++)   printf("%d,"a[i]);

  printf("\n");

  inv(a,10);

  printf("The array has been inverted:\n");

  for(i=0;i<10;i++)   printf("%d,",a[i]);

  printf("\n");

}

void inv(int  x[ ], int n)

{ int temp,i,j,m=(n-1)/2;

  for(i=0;i<=m;i++)

  { j=n-1-i;

     temp=x[i];  x[i]=x[j];  x[j]=temp; }

  return;

}

【C语言】10-指针

⑵ 实参用数组,形参用指针变量

#include <stdio.h>

void main()

{void inv(int  *x, int n);

  int i,a[10]={3,7,9,11,0,6,7,5,4,2};

  printf("The original array:\n");

  for(i=0;i<10;i++)   printf("%d,"a[i]);

  printf("\n");

  inv(a,10);

  printf("The array has been inverted:\n");

  for(i=0;i<10;i++)   printf("%d,",a[i]);

  printf("\n");

void inv(int  *x, int n)

{ int temp,*p,*i,*j,m=(n-1)/2;

  i=x;  j=x+n-1;  p=x+m;

  for(;i<=p;i++,j--)

    { temp=*i;  *i=*j;  *j=temp; }

  return;

}


⑶例:实参与形参均用指针变量

#include <stdio.h>

void main()

{void inv(int *x, int n);

  int i,arr[10],*p=arr;

  printf("The original array:\n");

  for(i=0;i<10;i++,p++)

     scanf("%d",p);

  p=arr;  inv(p,10);

  printf("The array has been inverted:\n");

  for(p=arr;p<arr+10;p++)

     printf("%d",*p);

  printf(“\n");

void inv(int *x, int n)

{ int *p, m, temp,*i,*j;

   m=(n-1)/2;

  i=x;  j=x+n-1;  p=x+m;

  for(;i<=p;i++,j--)

  { temp=*i; *i=*j; *j=temp; }

  return;}

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

一级指针变量与一维数组的关系

【C语言】10-指针

例:用选择法对10个整数排序

【C语言】10-指针

一、多维数组与指针

如:int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

⊙多维数组数据存储按先行后列顺序。

每行都是一个一维数组,a[0],a[1],a[2]是一维数组名。

每个一维数组含4个元素.

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

2.指向多维数组的指针变量

⊙指向数组元素的指针变量 

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

3.多维数组的指针作函数参数

⊙用指向变量的指针变量

用指向一维数组的指针变量

用二维数组名

【C语言】10-指针


例:  3个学生各学4门课,计算总平均分,输出第n个学生成绩

【C语言】10-指针

【C语言】10-指针



例:3个学生各学4门课,计算总平均分,并查找一门以上

                课程不及格学生, 输出其各门课成绩

【C语言】10-指针

4.总结:二维数组与一维数组指针变量的关系

如   int  a[5][10]  与  int   (*p)[10];

⊙二维数组名是一个指向有10个元素的一维数组的指针常量

p=a+i  使 p指向二维数组的第i行

*(*(p+i)+j)  a[i][j]

二维数组形参实际上是一维数组指针变量,

            即   int  x[ ][10]   int  (*x)[10]

变量定义(不是形参)时两者不等价

系统只给p分配能保存一个指针值的内存区(一般2字节);而给a分配2*5*10字节的内存区

字符串与指针


一、字符串的表示形式

字符串: 用双引号括起的一串字符。 可赋给字符型的数组或指针变量,

可通过字符型数组名或字符型指针变量输出。

1.用字符数组实现

【C语言】10-指针



2.用字符指针实现

使用字符指针可以处理字符串

字符指针的定义及使用

--定义和初始化。

例:   char *string="I love China!";

--在程序中可以直接把字符串常量赋给

     一个指针变量。

例:char *string;

        string="I love China!";

【C语言】10-指针

【C语言】10-指针

3.用下标法存取字符串中的字符

【C语言】10-指针

【C语言】10-指针

二、字符指针作函数参数

例: 用函数调用实现字符串的复制

【C语言】10-指针

【C语言】10-指针

三、对使用字符指针变量和字符数组的讨论

char  *cp;    与    char str[20]; 的区别

2.赋值方式:

【C语言】10-指针

【C语言】10-指针


【C语言】10-指针

【C语言】10-指针

5.用指针变量指向的格式字符串代替printf中的格式字符串(可变格式输出函数)

  char *format;

  format="a=%d,b=%f\n";

  printf(format,a,b); 

相对于:

   printf("a=%d,b=%f\n"a,b);

可以用字符数组实现:

   char format[ ]="a=%d,b=%f\n";

   printf(format,a,b);


6.判断和修正:

【C语言】10-指针


指向函数的指针


一、用函数指针变量调用函数。

2.函数指针变量定义形式:

【C语言】10-指针

3.函数指针变量赋值:如 p=max;

4.函数调用形式:c=max(a,b);  c=(*p)(a,b); 

5.对函数指针变量pn, p++, p--无意义

注:函数指针变量指向的函数必须有函数说明

【C语言】10-指针


例:求a和b中的大者

【C语言】10-指针



例:  用函数指针变量作参数,求最大值、最小值和两数之和

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

指针数组和指向指针的指针


用于处理二维数组或多个字符串

一、指针数组的概念

1.定义:数组中的元素均为指针变量

2.定义形式:

【C语言】10-指针


3.指针数组赋值与初始化

【C语言】10-指针

【C语言】10-指针


4.指针数组赋值与初始化

【C语言】10-指针

【C语言】10-指针

5.二维数组与指针数组区别:

【C语言】10-指针

【C语言】10-指针

例    用指针数组处理二维数组

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针


二、指向指针的指针—多级指针(了解)

【C语言】10-指针

【C语言】10-指针

3.定义形式:

【C语言】10-指针

如:char  **p

            如果:char  *name[ ]={"Follow me"……};

            char  **p;

            p=name+2;

    则:printf("%s\n",*p); 输出:Great Wall

【C语言】10-指针

【C语言】10-指针

【C语言】10-指针


4.二级指针与指针数组的关系

int  **p   与  int  *q[10]          

⊙指针数组名是二级指针常量

指针数组作形参,int  *q[ ]与int **q完全等价;但作为变量定义两者不同

系统只给p分配能保存一个指针值的内存区;而给q分配10块内存区,每块可保存一个指针值


三、指针数组作main函数的形参(掌握)

1.main函数的一般调用形式:main( ) 

2.main函数的有参数调用形式 :

      main( int argc , char *argv[ ] ) 

3.其中( int argc , char *argv[ ] 是形参,可以多个:

int argc;              命令名和所有参数个数之和

char *argv[ ];     各元素是指针,分别指向各参数字符串

4.在实际运行程序时,实参和命令名(C程序编译和连接后得到的可执行文件名)以命令行形式给出:

      命令名  参数1   参数2  ……  参数n [回车]


例   用命令行参数方式运行程序

【C语言】10-指针

有关指针的数据类型和指针运算


一、有关指针的数据类型的小结

【C语言】10-指针


二、指针运算小结

⑴ 指针变量加(减)一个整数

     如:p++;p--;p+i;p-i;p+=i;p-=i等,加减的值与类型有关。

⑵ 指针变量赋值

     p1=p2;(p1和p2都是指针变量,将p2的值赋给p1)

(3) 指针变量不指向任何变量,即取空值。表示为:p=NULL;

(4) 两个指针变量可以相减

     如果两个指针变量指向同一个数组为元素,则两个指针变量值之差是

     两个指针之间的元素个数。但p1+p2并无实际意义。

(5) 两个指针变量比较

【C语言】10-指针


三、void指针类型

1. 定义时不指定指向哪一类数据

2.用动态存储分配函数时返回void指针

3.它的值赋给另一指针变量时,要强制类型转换

 引致:教材

 C程序设计 (第二版)

          谭浩强编著 清华大学出版社



内容:提供更好的学习资源



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《【C语言】10-指针》的版权归原作者「学生成才」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注学生成才微信公众号

学生成才微信公众号:yunyu-68

学生成才

手机扫描上方二维码即可关注学生成才微信公众号

学生成才最新文章

精品公众号随机推荐