整理的C语言指针重点

来源:互联网 发布:电脑双肩包推荐 知乎 编辑:程序博客网 时间:2024/06/07 05:31

1.在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,约定“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其他数据结构的地址。因为数组或函数都是连续存放的,通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。凡是出现数组,函数的地方都可以用一个指针变量来表示。
2.未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。C语言中提供了地址运算符&来表示变量的地址。不允许把一个数赋予指针变量,被赋值的指针变量前不能再加“*”说明符。
3.指针变量只能进行赋值运算和部分算术运算及关系运算。
(1)赋值运算:
①指针变量的初始化赋值。int a;int *p=&a;||int a;int *p;p=&a;||int a,*p=&a;
②把一个变量的地址赋予指向相同数据类型的指针变量。int a,*p;p=&a;
③把一个指针变量的值赋予指向相同类型变量的另一个指针变量。int a,*pa=&a,*pb;pb=pa;
④把数组的首地址赋予指向数组的指针变量。int a[5],*pa;pa=a;||pa=&a[0];||int a[5],*pa=a;
⑤把字符串的首地址赋予指向字符类型的指针变量。char *pc;pc="c language";||用初始化赋值的方法写为:char *pc="C Language";
⑥把函数的入口地址赋予指向函数的指针变量。int (*pf)();pf=f;//f为函数名
(2)加减算术运算
指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。
①两指针变量相减:所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。
②两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。(可以与0比较,赋NULL值表示它不指向具体的变量)
4.指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,*是类型说明符,表示其后的变量是指针类型。而表达式中出现的*则是一个运算符用以表示指针变量所指的变量。
5.数组指针变量的说明和使用
如要使指针变量指向第i号元素可以把i元素的首地址赋予它或把数组名加i赋予它。
访问数组元素的两种方法:
下标法,即用a[i];指针法,即采用*(pa+i)
6.数组名和数组指针变量作函数参数:其实都是传地址。这就好像同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。
7.指向多维数组的指针变量 int(*p)[4]表示p是指向二维数组的指针变量:类型说明符(*指针变量名)[长度] "长度"表示二维数组分解为多个一维数组时,一维数组的长度的长度也就是二维数组的列数。
*(a+0)或*a是与a[0]等效的,它表示一维数组a[0]0号元素的首地址。
a,a[0],*(a+0),*a,&a[0][0]是相等的。
a+i,a[i],*(a+i),&a[i][0]是等同的。
&a[i]和a[i]也是等同的,以为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。
它是一种地址计算方法,表示数组a第i行首地址。由此得出,a[i],&a[i],*(a+i),a+i都是等同的。
8.按指针变量的赋值不同来区别:char c,*p=&c;表示p是一个指向字符变量c的指针变量。char *s="C Language";则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。
9.将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量代替了格式串也是程序中常用的方法。
#include<stdio.h>
void main()
{
 static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
 char *PF="%d,%d,%d,%d,%d\n";
    printf("%d,%d,%d,%d,%d,%d,%d\n",a,*a,*(a+0),a[0],&a[0],&a[0][0],a[0]+0);
 printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
 printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
 printf("%d,%d\n",a[1]+1,*(a+1)+1);
 printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
}

/* 0  1  2  3
   4  5  6  7
   8  9 10 11 */

PS:例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和pf2之间相差4个元素。
10.把字符串指针作为函数参数的使用。要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。该程序完成了两项工作:一是把pss指向的源字符复制到pds所指向的目标字符中,二是判断所复制的字符是否为'/0',若是则表明字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。
#include<stdio.h>
cpystr(char *pss,char *pds)
{ while(*pds++=*pss++);}// !='\0'
void main()
{
char *pa="China",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s\nstring b=%s\n",pa,pb);
}
11.使用字符串指针变量与字符数组(都可以实现字符串的存储和运算)的区别:
①字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
②对字符数组作初始化赋值,必须采用外部类型或静态类型,如:static char st[]={"C Language"};而对字符串指针变量则无此限制,如:char *ps="C Language";
③对字符串指针方式char *ps="C Language";而对数组方式:static char st[]={"C Language"};不能写为:char st[20];st={"C Language"};而只能对字符数组的各元素逐个赋值。
12.函数指针变量: int(*pf)();表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整数。
13.函数指针变量形式调用函数的步骤如下:
①先定义函数指针变量 int(*pmax)();定义pmax为函数指针变量。
② 把被调函数的入口地址(函数名)赋予该函数指针变量,pmax=max;
③用函数指针变量形式调用函数,如z=(*pmax)(x,y);调用函数的一般形式为:(*指针变量名)(实参表)使用函数指针变量还应注意以下两点:
a.函数指针变量不能进行算术运算,这是与数组指针变量不同的,数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
b.函数调用中"(*指针变量名)"的两边括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。
14.指针型函数:返回指针值的函数
定义指针型函数的一般形式:
类型说明符*函数名(形参表)
{
……//函数体
}
"*"表明这是一个指针型函数,即返回值是一个指针,类型说明符表示了返回的指针值所指向的数据类型。
15.exit是一个库函数,exit(1)表示发生错误后推出程序,exit(0)表述正常退出。
16.函数指针变量和指针型函数在写法和意义上的区别:
int(*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)两边的括号不能少。int*p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
17.指针数组是以一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。(对比7)
指针数组说明的一般形式:类型说明符*数组名[数组长度]  例如:int *pa[3]表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。通常可用一个指针数组指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。

原创粉丝点击