我们知道计算机中每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
例如
这里6356748就是a的内存地址
什么是指针呢?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。所以在C语言中,指针存的就变量的地址。
例如
#include<stdio.h>
int main()
{
int a=10;
int *p;
p=&a;
printf("%d %d %d %d\n",a,&a,p,*p);
return 0;
}
输出结果为:
这里表明指针p指向的是整型数据a的储存地址,而*p为整型数据a的值。
指针变量声明的一般常见形式有:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
既然指针存的是地址那我们可以通过直接访问地址来可以对变量进行操作
例如在自己编写交换函数时是无法使两个变量的值发生改变
但是当我们使用指针时就会发生变化
可以看出使用的变化。
我们可以给把变量的地址赋值给p但是不能直接把一个数赋值给指针变量例如
p=100;这就是错误的写法;但是我们可以使用*p=100;而且这样还会改变指针所指向的变量例如
当我们使用函数返回指针时,返回的是指针的首地址
另外,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();
printf("%d\n", r[i] );
}
printf("r的首地址为%d\n",&r[0]);
return r;
}
/* 要调用上面定义函数的主函数 */
int main ()
{
/* 一个指向整数的指针 */
int *p;
int i;
p=getRandom();
printf("指针p的首地址为%d\n",p);
for(i=0;i<10;i++ )
{
printf("指针p当前地址为:%d ",p+i);
printf("指针*p当前值为%d\n",*(p+i));
}
return 0;
}
输出结果为:
可以看出,当使用指针函数时,返回的是数组的首地址,然后通过调用指针的地址输出每个值
大概要说的就是这些。