指针结构体总结
一、指针
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;
可以将结构体中嵌套入另一个结构体。