最近要开始写操作系统了,老师说要用到C,已经很久没有写C(将近三年~),基本都忘了C的语法格式了,现在开始复习同时补上之前的博客。C里面最难的就是指针了,所以从这里开始。
首先,我们要明白一点,什么是指针?指针是干嘛的?
请注意:以下代码全部在codeblocks上编译运行过了,保证正确,请在看的同时也把他们复制或者敲一遍运行一次再接着一段一段看。不练习是永远学不会的,还有一种方法就是,拿纸抄,大概率没几个人愿意这样做吧,老师说他们以前机器要排队用所以才先在纸上检查几遍再去编译调试。
#include
int main ()
{
int var1;
char var2[10];
printf("var1 变量的地址: %p\n", &var1 );
printf("var2 变量的地址: %p\n", &var2 );
return 0;
}
上面的&var1是什么?老师应该提过,&var代表了var的地址,这里&var就是一个指针,这样看,指针貌似没什么了不起,不就是变量的地址吗?是的,指针就是用来存地址的。
然后介绍一下什么是NULL指针,也就是空指针
用%P可以输出地址
指针也可以进行加减操作,所以ptr++是合法的,一开始是null所以输出的地址是0X0,这里指针是double 类型的,所以加1操作后地址变成了8,因为double 类型占8个字节,如果这里是int *ptr的话,那么输出的地址就是4,变换不同的数据类型可以检测到你的机器各种数据类型的存储结构(有的机器里面int是2个字节)
#include
int main ()
{
double *ptr = NULL;
printf("ptr 的地址是 %p\n", ptr );
ptr++;
if(ptr) printf("ptr 的地址是 %p\n", ptr );
else printf("no,it is null");
return 0;
}
当然指针还有别的用途:
int a = 20;
int *ptr = a;
那么ptr =?答案是20;那这就和没有*是一样的了?是的,int *ptr=a和int ptr=a;ptr的值是一样
但是如果是:
int a = 20;
int *ptr = &a;或者int *ptr;ptr=&a;那这样,ptr存的就是a的地址;
这里就涉及到指针的含义了,这里指针事实上保存的是a的地址,a是一个变量,存储在计算机的某个地方,用int *ptr = a;就可以让ptr保存a的地址了,这样有什么好处?暂时别急,到最后自然就知道了。
那么这里怎么使用呢?
#include
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
int *num;
ip = &var; /* 在指针变量中存储 var 的地址 */
num = var;
printf("the num is %d\n",num);
printf("Address of var variable: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("Address stored in ip variable: %p\n", ip );
/* 使用指针访问值 */
printf("Value of *ip variable: %d\n", *ip );
return 0;
}
我们接着来看:
#include
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;
/* 指针中的数组地址 */
ptr = var;
for ( i = 0; i < MAX; i++)
{
printf("存储地址:var[%d] = %x\n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );
/* 移动到下一个位置 */
ptr++;
}
return 0;
}
这段代码运行的结果是:
ptr存储的是地址,*ptr是那个地址里存的变量
而指针可以直接ptr++,ptr--这样操作,所以我们可以不用数组名加下标的方式来读到值,这样似乎是简单了?但是也没必要搞个指针呀,毕竟数组已经存在那了,空间已经占了,多出来指针又占了一个空间是不是?(或者觉得也就多了4个字节也没啥,空间也没浪费多少)没关系刚开始我也这么觉得,后来,后来就知道了。。。我们接着看:
那么是不是也可以创建一个指针数组呢?
int *a[10]还是int (*a)[10]? 是不是有点懵逼?
我们说int *a,int* a,(注意*一个是靠近a,一个是靠近int 都是指针的声明),那么上面的int *a[10],表示的是