一 使用指针需注意的问题
1、定义指针变量时,左侧应有类型名,否则就不是定义指针变量。
2、指针变量的含义包括两方面;一是以存储单元编号表示纯地址;二是指向存储单元的数据类型。
3、指针变量中只能存放地址,不要将一个整数赋给一个指针变量。
4、指针中不可通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值(数据的方向是从实参传递到形参,单向传递)
5、基于安全性问题,必须初始化指针,一般初始化为NULL.
二 通过指针引用数组及指针的运算
1、数组元素的指针就是数组元素的地址(数组元素都在内存中占用存储单元,它们都有相应的地址)
2、数组名代表数组的首元素,引用其的方法为:
(1)下标法,如a[i]形式;
(2)指针法,如*(a+i)或*(p+i).
3、指针运算
(1)指针以指向一个数组元素时,可以进行以下运算
p+1,p-1,++p,p++,p- -,- -p
(p+1是指向同一数组中的下一个元素,加一代表的是加上一个数组元素所占用的字节数,同理可知p-1)
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p;
p=a;
printf("%d\n",p);
printf("%d",p+1);
return 0;
}
各种类型的大小:int类型四个字节,char类型一个字节,long,double,long long类型均为八个字节,long double类型为十六个字节
4、*(p+i) 或 * (a+i)是p+i 或a+i所指向的数组元素,即a[i],三者等价([ ]是变址运算符,将a[i]按a+i计算地址,然后找出此地址单元的值
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p;
p=a;
printf("%d\n",*(p+1));
printf("%d\n",*(a+1));
printf("%d",a[1]);
return 0;
}
5、P2 - P1,指的是元素的相对距离,结果计算为:(p2-p1)/数据元素的长度(类型)
例:p2指向a[3.]为16,p1 指向a[1.]为8,p2-p1 =(16-8)/4=2而p2+p1无实际意义
计算数组长度 sizeof(数组名)/sizeof(数组类型)
6、++(*p) 表示P 所指向的元素加1;如:p=a,++(*p)相当于++a[0],若a[0]的值为1,则执行++(*p)后a[0]的值为2
7、需注意的是,* (p++)与 * (++p)的作用是不相同的前者是先取*p的值,在进行p+1,后者是先进行p++ ,再取 *p
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p;
p=a;
printf("%d\n",*(++p));//*(p++)
//*(++p)的结果为2,*(p++)的结果为1
return 0;
}
例;若p的初值为a[0],输出 *(p++),得到a[0],输出 *(++p),得到a[1.]的值。
(以上的指针运算均不可用数组名代替,数组名代表的是首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的,如a++是无法实现的。)