C语言指针篇一
程序员文章站
2024-03-07 16:50:15
...
取地址运算
运算符&
1.取一个int变量的地址
#include<stdio.h>
int main()
{
int i=0;
printf("0x%p",&i);//用printf输出地址
}
//&取一个变量的地址
//但是地址的数据类型和int是否相等取决于编译器和架构
指针变量(指针变量就是记录地址的变量)
指针变量作为形参
#include<stdio.h>
void fun1(int *p);
void fun2(int p);
void fun3(int p);
int main()
{
int i=10;
int j;
//观察以下三项是否相同
printf("&i=0x%p\n",&i);//输出地址
fun1(&i); //以指针为形参,输出地址
//写法错误,在32位架构下相同,64位架构则不同
j=(int)&i; //强制类型转换,否则会报错
fun2(j); //将地址强制转换为int型,输出地址
fun3(i); //直接在函数里读形参的地址
}
void fun1(int *p)
{
printf("&i=0x%p\n",p); //这里是p,不是*p
}
void fun2(int p)
{
printf("&i=0x%p\n",p);
}
void fun3(int p)
{
printf("&i=0x%p\n",&p);
}
强制类型转换出现Warning,不管它,继续
只有第三个不同。但是要避免第二种写法。
*p和p是什么关系
当p戴上了*的帽子,*p就是当前值,p就只这个值所在地址
#include<stdio.h>
void fun1(int *p);
void fun3(int p);
int main()
{
int i=10;
int j;
//printf("&i=0x%p\n",&i);//输出地址
fun1(&i); //在已知地址上改变 值
fun3(i); //读i值
}
void fun1(int *p)
{
printf("&i=0x%p\n",p); //p是地址
printf("&i=%d\n",*p); //*p是值
*p=16;
}
void fun3(int p)
{
printf("i=%d\n",p);
}
例1:
#include<stdio.h>
void fun(int a[],int len,int *max,int *min);
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,16,17,23,24,25};
int min,max;
fun(a,sizeof(a)/sizeof(a[0]),&max,&min);
printf("min=%d,max=%d\n",max,min);
return 0;
}
void fun(int a[],int len,int *max,int *min)
{
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];
}
}
}
注:*p必须要被赋值一个变量的地址值,p才能在左边随意改变
如果它没有被赋值一个变量的地址值,不能直接给p赋值
数组变量是特殊的指针
函数参数表中的数组实际上是指针
const
//表示不能通过这个指针去修改那个变量
const int *p=&i;
*p=26;//error
i=26;//OK
p=&j;//OK
//表示一旦得到了某个变量的地址,不能再指向其它变量
int *const q=&i;//q是const
*q=26;//OK
q++;//Error
*q=&j;//error
//const在*前表示值不能被修改,const在*后面表示指针不能被修改
上一篇: 关于c语言----------指针(一)
下一篇: 使用harbor搭建docker仓库