指针结构体总结

指针结构体总结

一、指针

1.一些概念

指针指的是一个内存单元的地址,该单元的内容里面存放的是数据。指针变量的值是单元的地址。

&为取址运算符,&可以得到对象的地址,且是首地址。scanf函数即用&a生成了指向a的指针来给a赋值。

*为指针运算符,作为运算符写在定义的指针前,显示的是指向对象的值,而不是地址。假定a指向b,*a即表示b。

定义指针方法如下:

int b;
int *a;//定义一个指向int型变量的指针变量a,a指向b。
a=&b;//即a指针变量的值是整型变量b的地址。

表示地址的符号为 %p 。

2.指针的应用

(1)与函数参数

可以用于在函数中修改变量的值。

void function(int *a)
{
	
}
//......
function(&m);

只有将m的地址传入函数给到 指向int型变量的指针变量a ,在函数内使用*a来等价变量,在出函数时对变量值m的修改才有效。因为这个函数中修改的是特定地址中存放数据的值。

我们也可以用这种方法在函数中进行两值互换,排序等各类操作。

(2)与数组

数组实际上就是指针,数组名是指向该数组第一个元素的指针。

有a数组,a为数组名,a的值就是&a[0]。我们可以有指针p的值是&a[0]的值,指针p指向第一个元素a[0]。p也可以定义为指向数组的第x个元素,p+i是指向第x个元素后第i个元素的指针。*(p+i)就是a[x+i],也可写作p[i]。

所以&a[0],p+0,a+0,&p[0]都可以表示数组第一个元素的地址。

#include<stdio.h>
int main()
{
	int i;
	int a[5]={1,2,3,4,5};
	int *p=a;//a的值是a[0]的地址
	for(i=0;i<5;i++)
		printf("a[%d]=%d *(a+%d)=%d p[%d]=%d *(p+%d)=%d\n",i,a[i],i,*(a+i),i,p[i],i,*(p+i));
	for(i=0;i<5;i++)
		printf("&a[%d]=%p a+%d=%p &p[%d]=%p p+%d=%p\n",i,&a[i],i,(a+i),i,&p[i],i,(p+i));
	return 0;
}
/*运行结果如下:
a[0]=1 *(a+0)=1 p[0]=1 *(p+0)=1
a[1]=2 *(a+1)=2 p[1]=2 *(p+1)=2
a[2]=3 *(a+2)=3 p[2]=3 *(p+2)=3
a[3]=4 *(a+3)=4 p[3]=4 *(p+3)=4
a[4]=5 *(a+4)=5 p[4]=5 *(p+4)=5
&a[0]=000000000062FDF0 a+0=000000000062FDF0 &p[0]=000000000062FDF0 p+0=000000000062FDF0
&a[1]=000000000062FDF4 a+1=000000000062FDF4 &p[1]=000000000062FDF4 p+1=000000000062FDF4
&a[2]=000000000062FDF8 a+2=000000000062FDF8 &p[2]=000000000062FDF8 p+2=000000000062FDF8
&a[3]=000000000062FDFC a+3=000000000062FDFC &p[3]=000000000062FDFC p+3=000000000062FDFC
&a[4]=000000000062FE00 a+4=000000000062FE00 &p[4]=000000000062FE00 p+4=000000000062FE00
*/

对于多维数组,如a[3][4]中a[0]、a[1]、a[2]分别是三个一维数组的数组名。一维数组的数组名表示的是数组第一个元素的地址,所以 ,a[0] 表示的就是元素a[0][0] 的地址,即a[0]为&a[0][0]。同理得*(p+i)+j==&a[i][j]。

3.指向指针的指针

一个指向 int 类型指针的指针:int **a;

int c;
int **a,*b;
b=&c;
a=&b;
//a的值是指针b的地址,与b的值无关。

二、结构体

1.概念

结构体允许存储不同类型的数据项,并将其构成一个整体结构。

定义为如下形式:

struct xyz
{
	int x;
	long y;
	double z;
};
struct xyz a;//struct xyz相当于类型名。
struct xyz b;

//也可写作
struct xyz
{
	int x;
	long y;
	double z;
}a,b;

.为句点运算符,可访问结构体的某一成员,如a.x,b.z。

->为箭头运算符,是用指针访问结构体中的成员。如果要在函数中改写结构体中某一成员的值,可传入xyz结构体a变量的地址,函数中用struct xyz *m,即指向xyz结构体变量的指针m来接收,在函数中用*m来等价变量,(*m).x就是m指向的结构体变量中的成员x。有了箭头运算符,可将(*m).x写成m->x。

可用typedef定义结构体

typedef struct xyz
{
	int x;
	long y;
	double z;
}Xyz;

之后只要用Xyz a定义即可。

2.结构体做成员

typedef struct xyz
{
	int x;
	long y;
	double z;
}Xyz;
typedef struct a_xyz
{
	int a;
	Xyz b
}A_xyz;

可以将结构体中嵌套入另一个结构体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值