文章目录
AutoLeaders控制组——C语言指针学习笔记倪文健
9.1.1取地址运算
运算符&:获得变量地址,操作数必须为变量。(地址通常用十六进制表达)
十六进制可用%x转换。
要输出地址用%p。例如:int i;printf(“%p”,&i);
地址的大小是否与int相同取决于编译器。在32位架构下,int于地址相等。
&不能取没有地址东西的地址。例如:&(a+b)为错误示范。
相邻int变量的地址相差4,因为int以4个字节为一个整体。
数组a[10]==&a,数组中的相邻元素地址相差4,即1个int。
9.1.2指针:记录地址的变量
指针就是保存地址的变量。
int* p=int *p
指针可作为参数:
void f(int *p);在被调用的时候得到了变量地址
int i=0;f(&i);在函数里可以通过这个指针访问外面的这个i
运用:
*是单目运算符,用来访问指针表示的地址上的变量,可做左值也可做右值:
int k=*p;
*p=k+1;
*和&互为相反作用:
*(&q)=q;
9.1.3指针的使用
函数返回多个值,某些值就只能通过指针返回
传入的参数实际上是需保存带回的结果的变量
交换:
void swap(int *pa,int *pb)
{
int t=*pa
*pa= *pb
*pb=t
}
找最大最小值:
让函数返回特殊的不属于有效范围内的数表示出错
指针常见错误:定义了指针变量,没有指向任何变量,就使用指针
9.1.4指针和数组
数组实际上就是指针,在函数里修改数组的值,主函数里数组的值也会改变。
int *a=int a[];
数组不用&取地址,但数组单元要用&取地址。
[]运算符可以对数组做,也可以对指针做。
数组变量是const的指针,不能赋值。
例如:可以int *p=a不能int p[]=a;
9.1.5指针与const
当指针是const时:
int* const q=&i;//q是const
*q=26;//ok但不能q++
当所指是const时:
const int *p=&i
*p=26//错误, *p是const
i=26//ok p=&j//ok
const在*前,所指不能被修改
const在*后,指针不能被修改
const int a[]={1,2,3};数组变量已经是const的指针,表明数组的每个单元都是const int;必须通过初始化赋值。(作用:保护数组不被破坏)
9.2.1指针运算
*p+1不是在地址值上+1,而是+sizeof(指针所指类型)
让指针+1指向下一个变量:
int a[10];
int *p=a;
*(p+1)指向a[1]
指针指向都是一片连续分配的空间。
当指针相减时,输出为地址差/sizeof(指针所指类型
指针可加减,不能乘除;可比较(<,>,!=)比较它们的地址大小
0地址表示特殊的事:
返回指针无效
指针没有初始化
NULL表示0地址
不同类型的指针不能互相赋值
指针类型转换:
int *p=&i;
void*q=(void *)p
void*表示不知道指向什么东西的指针
9.2.2动态内存分布
要用malloc,要有头文件#include <stdlib.h>
int *a=(int *)malloc(n *sizeof(int));
表示a分配了n个int类型的内存。
即*a=a[n];
malloc后一定要free()
free必须是原始地址,不能a++后还
申请的空间是有限的