C语言中的指针相关使用
1.取地址运算
在了解指针之前,先了解一下之前已经使用过的&运算符
scanf(“%d”,&i);中的&
作用是获得变量的地址,它的操作数必须是变量
int i;printf(“%x”,&i);
地址的大小是否与int相同取决于编译器
int i;printf(“%p”,&i);
%p在 C 语言中用来是打印变量地址的。它是一个格式控制符,p即pointer(指针)的缩写。指针的值是一个表示地址空间中某个存储器单元的整数。%p输出的结果一般是一个十六进制的整数,代表指针的值,附加前缀0x。
&不能对没有地址的东西取地址
2.指针变量
指针
就是保存地址的变量
指针变量
变量的值是内存的地址
普通变量的值是实际的值
指针变量的值是具有实际值的变量的地址
作为参数的指针
void f(int *p);
在被调用的时候得到了某个变量的地址
int i=0;f(&i);
在函数里面可以通过指针访问外面的这个i
#include<stdio.h>
void f(int *p);
int main()
{
int i=6;
printf("&i=%p\n",&i);
f(&i);
return 0;
}
void f(int *p)
{
printf("p=%p\n",p);
}
访问那个地址上的变量*
*是一个单目运算符,用来访问指针的值所表示的地址上的变量
可以做右值也可以做左值
int k=*p;
*p=k+1;
*左值之所以叫左值,是因为出现在赋值号左边的不是变量而是值,是表 达式计算的结果:
a[0]=2;
*p=3;是特殊的值,所以叫做左值
3.指针的使用
1.场景一
交换两个变量的值
void swap(int *pa,int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}
2.场景二
函数返回多个值,某些值就只能通过指针返回
传入的参数实际上是需要保存待会的结果的变量
#include<stdio.h>
void minmax(int a[],int len,int *max,int *min);
int main(void)
{
int a[]={1,2,3,4,5,6,12,15,23,62,66};
int min,max;
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min=*max=a[0];
for(i=1;i<len;i++)
{
if(a[i]<*min)
{
*min=a[i];
}
if(a[i]>*max)
{
*max=a[i];
}
}
}
函数返回运算的状态,结果通过指针返回
4.指针与数组
函数参数表中的数组实际上是指针
sizeof(a)==sizeof(int*)
但是可以用数组的运算符[]进行运算
数组变量是特殊的指针
数组变量本身表达地址,所以
int a[10];int *p=a; //无需用&取地址
但是数组的单元表达的是变量需要用&取地址
a==&a[0]
*运算符可以对指针做,也可以对数组做:
*a=25
数组变量是const的指针,所以不能被赋值
int a[] <==>int *const a=…
5.指针运算
给一个指针加1表示要让指针指向下一个变量
int a[10];
int *p=a;
*(p+1)—>a[1]
如果指针不是指向一片连续分配的空间如数组,则这种运算没有意义
指针计算
这些算术运算可以对指针做:
给指针加、减一个整数(+,+= , - , -=)
递增递减(++/一)
两个指针相减
*p++
取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
*的优先级虽然高,但是没有++高
常用于数组类的连续空间操作
指针的类型
无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
但是指向不同类型的指针是不能直接互相赋值的
这是为了避免用错指针