指针的算术运算
C 指针是一个用数值表示的地址。因此可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-。
如果p是一个指向地址 1000 的整型指针,p++后p将指向1004,因为p 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。
递增和递减一个指针
使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针
例如:
#include <stdio.h>
int main ()
{
int a[] = {10, 100, 200};
int i, *p;
/* 指针中的数组地址 */
p = a;
for ( i = 0; i < 3; i++)
{
printf("存储地址:a[%d] = %x\n", i, p );
printf("存储值:a[%d] = %d\n", i, *p );
/* 移动到下一个位置 */
p++;
}
return 0;
}
指针的比较
指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
指针数组
想让数组存储指向数据类型的指针。
声明一个指向整数的指针数组
int *p[];
实例:
#include"stdio.h"
void main()
{
int num[] = {1, 2, 3, 4, 5, 6};
int i;
int *p[6];
for(i = 0; i < 6; i++)
{
p[i] = &num[i];
//&取地址
//p[i]等于num[i]的地址
//赋值为整数的地址
}
for(i = 0; i < 6; i++)
{
printf("%d\t", *p[i]);
//*指向p[i]的地址
}
}
指向指针的指针
是一种多级间接寻址的形式,是一个指针连。
一个指针包含一个变量的地址。
当定义了一个指针的指针是,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
声明的形式如下:
int **ptr;
当一个目标值被一个指针间接指向另一个指针时,访问这个值需要使用两个*号。
实例:
#include"stdio.h"
void main()
{
int var = 1;
int *ip;
int **pip;
ip = &var; //ip取var的地址
pip = &ip; //pip取ip的地址
printf("%d\n", **pip); //**获取pip的值
}
传递指针给函数
实例:
#include"stdio.h"
#include"time.h"
/*
将指针变量传入函数
把时间赋值给指向指针变量的值
*/
void getSeconds(unsigned long *ulp)
{
//获取当前秒数
*ulp = time(NULL);
}
void main()
{
unsigned long sec; //定义一个变量
getSeconds(&sec); //将变量的地址传给指针变量
printf("%ld\n",sec);
}
c语言不支持把数组当作函数的形参,但能用指针代替数组
例如:
#include"stdio.h"
#include"time.h"
float getAvg(int *arr, int size)
{
int i;
float avg;
int sum = 0;
for(i = 0; i < size; i++)
{
sum += arr[i];
}
avg = (float) sum / size;
return avg;
}
void main()
{
int num[5] = {1, 4, 6, 8, 9};
float avg;
avg = getAvg(num, 5); //传递一个指向数组的指针做参数
printf("%4.2f\n", avg);
}
从函数返回指针
必须声明一个返回指针的函数
int * myFunction()
{
.
.
.
}
c语言不支持在调用函数时返回局部变量的地址
除非定义局部变量为static变量
如下:
#include"stdio.h"
#include"time.h"
#include"stdlib.h"
//返回一个随机数组的地址
int * getRandom()
{
static int r[10];
int i;
srand((unsigned)time(NULL));
for(i = 0; i < 10; i++)
{
r[i] = rand();
}
return r;
}
void main()
{
int i;
int *ip;
ip = getRandom();
for (i = 0; i < 10; i++)
{
printf("%d\t", *(ip + i));
}
}