c语⾔两个指针相等,C语⾔之指针,便于理解
⼀、指针变量定义
C语⾔有两种变量:
其中变量(普通变量)存储内容值;地址变量(指针变量)存储地址值。
1、定义的格式:
类型名 *指针变量名;
如:
int a,b,*p1,*p2;
float x,y,*p3,*p4;
chars,*p5,*p6;
注:
(1)定义变量(普通变量、指针变量)都必须在前⾯有类型名。
(2)在定义指针变量时,指针变量名前的“*”表⽰现定义的是⼀个指针类型的变量。星号并不是指针变量名的⼀部分,只有⼀个标志。
(3)指针变景专⼝⽤来存地址,禁⽌将⼀个整型值直接t给⼀不着变量。
int a,b,*p;
a=1000;
b=2000;
p=4000;//错误只能存地址值
2、指针变量的引⽤
“&”取地址运算符,通过&运算符可以取出普通变量的地址。
“”指针运算符,可以取出指针变量所指向的普通变量的值,(间接引⽤普通量)
*指针变量名
如:
int a,b=20,c=30,d=40,*p;
p=&d;
a=*p;a=d;
指针⽅法:
⼝诀:内容变量画房⼦,指针变量画指向,定义也要初始化,
⼝诀:地址变量得地址,得谁地址指向谁,有*为内容值,不是读就是写,=号左边是写操作
画图:数组,static,指针,链表,⽂件
注:
(1)可以通过赋值使⼀个指针变量“指向”某⼀普通变量(指针变量=&普通变量)。
*p=200;危险!//因此在C语⾔中指针必须定义且初始化
(3)变量名(普通变量、指针变量)都表⽰其存储单元内的值。
pl=p2;/*pl指向了p2所指向的单元*/
读出p2的内容值写到p1的"房⼦"⾥
(4)若指针变量p指向变量a,即将变量a的地址赋给了指针变量p。
指针变量本身有地址吗
如:int a=20,*p=&a;则有下列结果(等价表):
A、*p<=>a
B、p<=>&a
C、&*p<=>&a<=>p
D、*&a<=>*p<=>a
E、(*p)++ a++都是给变量a的值加1。
(*p)-- a--
++(*p) ++a ++*p
--(*p) --a --*p
(5)所有的指针变量在内存中分配的字节数相同。sizcof()
int *p1;
float *p2;
double *p3;
指针变量永远占两个字节(地址),前⾯类型表⽰的是该指针指向的内容值的类型例1:
请输出下列程序的结果
void fun(int*x,int*y)
{printf("%d %d",*x,*y);
*x=3;
*y=4;
}
main()
{int x=1,y=2;
fun(&y,&x);
printf("d% d%",x,y);
}
输出结果:2 14 3
*p1=*p2;
*p2=temp;}
main()
{
int a,b;
int *p1=&a,*p2=&b;
scanf("%d%d",pl,p2);swap(pl,p2);
printf("%d,%d",*pl,*p2);}
键盘输⼊2 5
输出结果:5,2
改动后:
#include请输出下列程序的结果void swap(int*pl,int*p2)
{int *temp;
temp=pl;
p1=p2;
p2=temp;
}
main()
{int a,b;
int*p1=&a,*p2=&b;
scanf("%d%d",pl,p2);swap(p1,p2);
printf("%d,%d",*p1,*p2);}
键盘输⼊:2 5
输出结果为: 2,5
*p1=*p2;
*p2=*temp;}
main()
{int a,b;
int *p1=&a,*p2=&b;
scanf("%d%d",pl,p2);
swap(pl,p2);
printf(%d,%d",*p1,*p2);
}
键盘输⼊:2 5
结果:是5,2吗?错误!会报错哦,指针变量不能任意指,必须初始化程序中temp没有初始化所以很危险哦⼆、⼀维数组与指针变量
说明:(1)
int fun(int a[10])<=>int fun(int*a)<=>int fun(int a[])
若数组做为形参,则将数组名做指针变量来处理。
指向数组的指针变量
1、指向数组元素的指针变量
由于数组元素与普通⼀样,所以定义指向数组元素的指针变量与定义指向普通变量的指针变量完全⼀样
如:
int s[10],a,b;
int b[3][6];
int*p;
p=&a;
p=&s[2];
p=&b[2][4];
2、指向⼀维数组的指针变量
注:数组a[]
(1)在C语⾔中规定:数组名a代表数组的⾸地址,⽽且是⼀个地址常量,且a<=>&a[0]
如:
如:
float a[10];floatp;p=&a[4];则p-3指向?---->a[1]
(3)
int a[N],*p=a;
p+i a+i &a[i] 地址三者相互等价
*(p+i) *(a+i) a[i] p[i] 元素四等价
当指针变量指向数组时,下标运算符(⼀级) ([])⽤于数组也可⽤于指针变量后
a)*(p+i)*(a+i)a[i] p[i]
b)p++、++p、p+=1、p=p+1
c)p--、--p、p-=1、p=p-1
d)*p++*(p++) *p-- *(p--)
e)*++p *(++p) *--p *(--p)
f)(*p)++ ++(*p)++*p
g)(*p)-- --(*p)--*p
如:
若有定义:
int b[5]={10,30,20,15,40};
int*q=b+2;
则:
++⼆级从右向左运算
q++表达式的值?,同时q指向了?----->(q++)--->20,b[3]
++q表达式的值?,同时q指向了?----->(++q)---->15,b[3]
(q)++表达式的值?同时q指向了?21,b[2]
++(q)表达式的值?同时q指向了?21,b[2]
例:
举例指针在数组中的使⽤:
main()
{int*p,a[3],I;
p=a;
for(i=0:i<3;i++) //for(i=0;i<3;i++)
scnaf("%d",p++); // scanf("%d",&a[i]);
printf("\n\n");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。