Appearance
指针
概念
一种数据类型,它的值是指向内存地址的值。
& 取地址符,可以取出变量所在内存地址。
c
#include <stdio.h>
int main ()
{
int a;
printf("a 变量的地址: %p\n", &a );
return 0;
}
取出的内存地址是一串16进制的值。
使用指针
c
#include <stdio.h>
int main ()
{
int a = 1;
int *pa;
pa=&a;
/* 使用指针访问值 */
printf("a 的值是: %d\n", *pa );
return 0;
}
空指针
空指针是内存中一个特定的区域
c
#include <stdio.h>
int main ()
{
int *pa = NULL;
printf("pa 的地址是 %p\n", pa );
//out => pa 的地址是 0x0
return 0;
}
指针的算术运算
指针支持四种算术运算 ++,--,+,-
eg:
c
#include <stdio.h>
int main ()
{
int a = 1;
int * pa;
pa=&a;
printf("pa 的地址是 %p\n", pa );
pa++;
printf("pa 的地址是 %p\n", pa );
pa--;
printf("pa 的地址是 %p\n", pa );
pa = pa + 10;
printf("pa 的地址是 %p\n", pa );
pa = pa - 10;
printf("pa 的地址是 %p\n", pa );
return 0;
}
指针与数组
c
#include <stdio.h>
const int SIZE = 5;
int main ()
{
int arr[] = {1,3,5,7,9};
int *p = &arr[0];
for(int i=0;i<SIZE;i++,p++){
printf("&arr[i] = %p\n",&arr[i]);
printf("p = %p\n",p);
printf("--------------\n");
printf("arr[i] = %d\n",arr[i]);
printf("*p = %d\n",*p);
}
}
嵌套指针
c
#include <stdio.h>
int main ()
{
int a = 1;
int *pa = &a;
int **ppa = &pa;
printf("&a = %p\n",pa);
printf("&pa = %p\n",ppa);
printf("&ppa = %p\n",&ppa);
printf("----------------\n");
//以下是三种取得a值的方法
printf("a = %d\n",a);
printf("a = %d\n",*pa);
printf("a = %d\n",**ppa);
return 0;
}
指针传递
我们先来看一个案例
c
#include <stdio.h>
void setA(int a){
a = 5;
}
int main ()
{
int a = 1;
setA(a);
printf("a = %d\n",a);
return 0;
}
我们把a传setA函数,企图让他设置a的值为5,但是
在函数setA,a的作用域只在函数内有效。
这时我们可以使用指针传递。如下:
c
#include <stdio.h>
void setA(int *a){
*a = 5;
}
int main ()
{
int a = 1;
setA(&a);
printf("a = %d\n",a);
return 0;
}
这样就达到了我们都目的,在面向对象编程中,这种方式叫做引用传递。