C语言指针

来源:互联网 发布:python做数据分析应用 编辑:程序博客网 时间:2024/06/03 15:20
C程序中的变量在内存中占有一个可标识的存储区, 每一个存储区是由若干个字节组成,每一个字节都有自己的地址, 而一个存储区的地址是指该存储区中第一个字节的地址。

1.什么是指针
地址就是指针,指针就是地址。指针变量就是值为地址的变量,指针变量的值就是某份数据的地址
指针变量同样也有自己的地址。

datatype *name = value;
或者datatype *name;name=value
定义一个指针变量name,*表示这是一个指针变量(是一种声明的意思,最终定义的是变量是name,而不是*name),意味着name值是一个地址。
name的值是datatype类型数据的地址。
地址中存储的数据类型是datatype,以后name+n,加的是n个该数据类型的大小。
所以value是一个地址值。
name=value。以后操作这个name。就是操作这个地址
记着 int *p=&a 以后操作p

*有三种理解,第一种就是乘法,第二种就是声明是一个指针变量,第三种取地址值。

以后你只要记住定义了一个变量name(name是定义出来的变量而不是*name),必须给name赋一个地址值。


2.指针的操作方式
1.*,*name,取这个地址存的数据值
2. ->,专用于结构体指针
3. [ ],name[i]实际上就是*(name+i)

3.指针和数组的对应
int a[10]a是数组首元素地址,&a是整个数组的首地址
int *p1p1=a,以后p1就可以代替a了(对应的是1维数组),以后就可以p[]这样操作

int b[n][10]这是个二维数组
int (*p2) [10]p2=&a或者=b,p2对应的是二维数组

4.指针的特殊操作

( )和[ ]优先级相等,大于*,从左到右看

int * p定义一个指针变量,值是一个地址,是int型数据的地址。*表示p是一个地址。对应一维数组
int * p [10]定义一个数组,数组每一个元素都是一个指针变量,每个元素值都是一个地址。
int (* p) [10]定义一个指针变量,值是一个地址,地址下存储的是一个数组。对应二维数组
int * p ( )定义一个函数,返回值是一个指针变量。
int (* p ) ( )定义一个指针变量,值是一个地址,地址下存储一个函数。
(int *) 0x3333fffff将一个地址值强制转换,是这个地址里存储的是int型数据。


对于malloc,(Position *)malloc(sizeof(struct LNode))。在堆中申请一个sizeof(struct LNode)这么大的空间,并返回这个空间首地址,(Position *)就是将这个地址强制转化,使这个空间存储的是Position型数据。
C语言中的malloc只是提供了一个地址,需要自己再将这个地址强制转化一下。
而C++中的new就不需要再次强制转化这个地址。

函数传参数,只能将数组首元素的地址(数组名)当做是参数。因此声明中可以有int *p,或者int p[]这两种方式,第二种方式只能用在声明中。都代表了传进来的参数要是一个地址。函数内部,p就是地址,通过[ ]的方式操纵这个地址。
int a[10],a[1]代表*(a+1)

原创粉丝点击