Skip to content

指针

概念

  • 一种数据类型,它的值是指向内存地址的值。

  • & 取地址符,可以取出变量所在内存地址。

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;
}

这样就达到了我们都目的,在面向对象编程中,这种方式叫做引用传递。