指针学习笔记

指针

1.变量是如何在内存中存放的

1.变量在内存中的实质是一块内存区域,这块区域的值是可变的,故称“变量”。而我们可以通过const等一些操作符来改变它的操作属性。

2.早期操作变量是通过地址来实现的。而现在编译器会将地址与变量名对应起来,形成符号表,在操作变量时,通过变量名索引来寻找对应的地址进行操作的。

3.&是取址符,负责获得变量的地址。如

int a;
b=&a;

此时变量b的值即是a的地址。

2.什么是指针

1.指针是一种特殊变量,用于存放变量的地址

int a =10;
int *point=&a;

易错点:在int *p,q;中p是一个指针,而q是一个普通变量
int* p,q中也是如此,因为没有int*这种变量类型。

2.*只有一个算子时表示读取指针所存放的地址,并对地址对应的变量进行操作。

int a =10;
int *point=&a;
*Point =26;
printf("%d",a);

此时输出的值为26。
利用此特性,我们可以通过函数来操作变量了。

void f(int *p){
*p=134;
}
int a=23;
f(&a);
printf("%d",a);

输出的值为134。
这是传入函数的仍是一个参数,但该参数是a的地址,而且用指针p来储存。在函数中,*p读取了p中的地址并对该地址对应的变量a进行操作=134,故变量a的值被改为了134。

而实际应用上*p可以被认为是一个整数,代表*p所指向变量的值。例如:

change f(int *pa,int*pb){
    int t=*pa
    *pa=*pb
    *pa=t;
}
int a=23;
int b=27;
change(&a,&b);

*pa=*pb中,*pb可视为变量b的值,故行代码实际意义可理解为读取指针pa所存放地址所对应的变量a并将其值改变为变量b的值。

2.指针的应用

1.在函数中操作变量。

上面已经讲明白了,而常见应用为定义一个可以交换变量的函数。

2.返回多个值

1.函数中return只能返回一个值。

2.我们可以通过指针来改变变量的值从而实现返回多个值。

3.也可以用return返回一个状态值,用指针返回实际值。

易错点:不能定义一个指针,还没用指向一个变量,就使用它

3.数组相关操作

3.数组与指针

1.

数组变量是一个特别的指针

故可以进行以下操作
int a[10];int *p=a;无需取址符。
因此在字符串中,

char a[10];
scanf("%s",a)

读取字符串就没有取址符。

2.

数组变量所存的地址为首个数组单元的地址。故
a—>&a[0]。

3.

数组的单元为变量,取地址需要取址符。

4.

[]也可以对指针操作。在操作时是将其所指变量当作一个数组处理。

5.

同理*也可以处理数组,如果有一个数组a,*a的值为a[0]的值。

6.

数组变量是一个const指针,故不可写。所以数组变量间不可互相赋值。因此,以下操作为错误操作

int a[10];
int b[10];
a=b

但是可读,故可以

int *p=a

因而实际上a-->int *const a

7.

由于数组变量是一个特殊的指针,因而在传入函数参数表中int a[]int *a是在做同一件事。

const 与 指针

1.int *const p=&a中p只能指向a而不能指向其他变量。

2.const int *p=&a中不能通过p改变a。但a可以变,p可以变,也就是说不能通过p进行赋值。

3.int const* p是和const int *p相同的,故应以*在const前还是const后区分。

4.const可以保护变量和数组在通过地址传入函数时不会被改变。

指针运算

1.

当指针指向一个数组变量时,指针运算结果与数组类型有关,例如

char a[10];
char *p=a;
int b[10];
int *q=b

p+1 中p的1地址加了1,但q+1中q的地址加了4,因而指针加减实际上加或减了数值乘以sizeof。

*(p+1)指向了a[1],*(q+1)指向了b[1],因而我们也可以通过指针运算来遍历数组。

2.

应该用null来表示0地址。因为地址0是一个不能碰的东西。

3.

*p++是指读取p后又在p的基础上使得p=p+1。故可以通过它来遍历数组。同时这条代码在某些时候是一条汇编语言,能加快效率。

动态内存分配

1.

malloc函数使用前需调用stdlib数据库。

malloc返回的数据类型为void*,故使用时应转化为要使用的数据类型。

malloc()会开辟一片内存空间。

可以在C99前用malloc来初始化一个大小未定的数组

int*a;
a=(int*)malloc(100);

此时a就可以当作大小100的数组使用

2.

free()是用来释放内存空间。free(a)就是释放a所占据的空间
free使用时要原封不动的将内存空间还给系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值