指针
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使用时要原封不动的将内存空间还给系统。
1066

被折叠的 条评论
为什么被折叠?



