指针?什么是指针? 从根本上看,指针是一个值为内存地址的变量,
所以说,指针变量的值是 地址!
假设 ptr是一个指针变量名 ,可以编写如下 语句
ptr=&pooh;// 把 pooh的地址赋给ptr
说明: 对于这条语句 我们说 ptr指向 pooh. ptr 和 & pooh 的区别在于 ptr是变量 而 &pooh 是 常量
ptr = &bath 现在 把ptr 指向bah 而不是 poth
如果说 我们已经知道了 ptr 指向的地址,那么我们如何 找出该地址的储存的值呢
val = *ptr ; // 找出ptr 指向的值
介绍一下 * :间接运算符(也叫 解引用运算符)
ptr = &bath ; val=*ptr;
这两句 相当于 一句 val=bah;
那么怎么样声明 指针呢?
声明指针变量时必须指定指针所指向变量的类型,因为不同的变量占用不同的储存空间
例: int *pi; // pi 是指向int 类型的指针
char *pc;// pc是指向char 类型变量的指针
float *pf,*pg;// 两个都是指向float 类型变量的指针
指针是可以在函数间 通信的:可以提高我们传递参数的速度
记住一点:在声明 函数的时候 变量使用 指针变量,在传递 参数的时候 我们要传递参数的地址
// 举个例子 : 使用指针解决交换函数的问题
#include<stdio.h>
void interchange(int * u, int * v); //在声明 函数的时候 变量使用 指针变量
int main(void)
{
int x = 5,y = 10;
printf("Originally x= %d and y = %d .\n",x,y);
interchange(&x,&y); //在传递 参数的时候 我们要穿参数的地址
printf("Now x = %d and y=%d.\n",x,y);
return 0;
}
void interchange(int *u,int *v)
{
int temp;
temp=*u;
*u=*v;
*v=temp;
}
下面再介绍一下 指针的 八种基本操作
/*
在这里给出指针的 8中基本操作
*/
#include<stdio.h>
int main()
{
int urn[5]={ 100,200,300,400,500};
int *ptr1,*ptr2,*ptr3;
ptr1 = urn; // 把一个地址赋给 指针
ptr2 = & urn[2];// 把一个地址赋给指针
// 解 引用指针,以及获得指针的地址
printf("pointer value,dereferenced pointer, pointer address:\n");
printf("ptr1 = %p,*ptr1 = %d, & ptr = %p\n",ptr1,*ptr2,&ptr3);
// 指针加法
ptr3=ptr1+4;
printf("\nadding an int to a pointer:\n");
printf("ptr1+4= %p,*(ptr1+4)=%d\n",ptr1+4,*(ptr1+4));
// 递增指针
ptr1++;
printf("\nvalues after ptr1++:\n");
printf("ptr1 = %p,*ptr1 =%d,&ptr1=%p\n",ptr1,*ptr1,&ptr1);
// 递减指针
ptr2--;
printf("\nvalues after --ptr2:\n");
printf("ptr2 = %p,*ptr2 =%d,&ptr2=%p\n",ptr1,*ptr1,&ptr1);
// 恢复为初始值
--ptr1;
++ptr2;
printf("\nPointers reset to original values:\n");
printf("ptr1=%p,ptr2=%p\n",ptr1,ptr2);
//一个指针减去另一个指针
printf("\nsubtracting one pointer from another:\n");
printf("ptr2 = %p,ptr1 = %p ,ptr2-ptr1 =%td\n",ptr2,ptr1,ptr2-ptr1);
// 一个指针减去一个整数
printf("\nsubtracting an int from a pointer:\n");
printf("ptr3 = %p,ptr3-2 = %p\n",ptr3,ptr3-3) ;
return 0;
}