C语言指针

c语言指针中,一维指针比较容易懂,但是遇到二维指针,有时侯就会不知道怎么给指针赋值了。

1、一维指针

通常是用来指向“数据块”的某个存储单元,它的值就是“那个存储单元的地址”。

特点:直接指向存储单元

如:

char MyArray[5];

char *p1;  //声明一维指针变量p1

p1=&MyArray[4];

//使用p1指针指向"MyArray[4]"

//这样“p1的值”等于“MyArray[4]的地址”,而一维指针变量p1的地址是由系统分配的。

printf("MyArray[4] =%d\r\n",*p1); //打印"所指向的数据值"

printf("p1 =0x%p\r\n",p1); //打印p1的值

printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址

2、二维指针

二维指针通常是用来指向“一维指针的地址”,间接指向数据块的某个存储单元。这个“一维指针的地址”就是这个二维指针的值,“这个二维指针变量的地址”是由系统分配的;

特点:间接指向存储单元

char MyArray[5];

char *p1;  //声明一维指针变量p1

char **p2; //声明二维指针变量p2

p1=&MyArray[4];  //使用p1指针指向"MyArray[4]"

p2=&p1; //将p1指针变量的地址保存到p2中

printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"

printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"

printf("p1 =0x%p\r\n",p1); //打印p1的值,即"MyArray[4]"的地址

printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值",即"MyArray[4]"的地址

printf("The address of p1 =0x%p\r\n",&p1); //打印“指针变量p1”的地址

printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值,即"指针变量p1"的地址

3、三维指针

三维指针通常是用来指向“二维指针的地址”。

特点:间接一次后,再间接指向存储单元

char MyArray[5];

char *p1;  //声明一维指针变量p1

char **p2; //声明二维指针变量p2

char ***p3; //声明三维指针变量p3

p1=&MyArray[4];  //使用p1指针指向"MyArray[4]"

p2=&p1; //将p1指针变量的地址保存到p2中

p3=&p2; //将p2指针变量的地址保存到p3中

printf("MyArray[4] =%d\r\n",*p1); //打印"p1所指向的数据值"

printf("MyArray[4] =%d\r\n",**p2); //打印"p2所指向的数据值"

printf("MyArray[4] =%d\r\n",***p3); //打印"p3所指向的数据值"

printf("p1  = 0x%p\r\n",p1);//打印p1的值

printf("*p2 = 0x%p\r\n",*p2);//打印*p2"的值"

printf("**p3 = 0x%p\r\n\r\n",**p3);//打印**p3"的值"

4、测试程序

#include

//函数功能:打印数组数据

void Print_MyArray(int *array, int size)

{

  int i;

//打印数组开始/

  for(i=0;i

  {

    printf("MyArray[%d]=%d",i,array[i]);

    if(i!=4) printf(", ");

    else printf("\r\n");

  }

//打印数组结束/

}

//c语言一维数组,二级指针和三级指针

int main(int argc,char *argv[])

{

  int i;

  int MyArray[5];

  int *p1;

  int **p2;

 // int **p2=&p1;//在声明变量时,可以这么赋值

  int ***p3;

  for(i=0;i<5;i++)//修改数组中的数据

  {

    MyArray[i]=i+1;

  }

  Print_MyArray(MyArray,5);//打印数组数据

  p1=MyArray;

  for(i=0;i<5;i++)//修改数组中的数据

  {

    *p1=*p1+1;//修改数组的值

    p1++;  //这里是修改p1的值,但指针变量p1的地址是保持不变的

  }

  Print_MyArray(MyArray,5);//打印数组数据

  p1=MyArray;//使用p1指针指向"MyArray[]"

  p2=&p1;//将p1指针变量的地址保存到p2中

  for(i=0;i<5;i++)//修改数组中的数据

  {

    **p2=**p2+1;//"**p2"是"*p2"指向的存储数据

    (*p2)++;

     //这里需要用小括号

     //这里是修改p1的值,但指针变量p1和p2的地址是保持不变的

  }

  Print_MyArray(MyArray,5);//打印数组数据

  p1=MyArray;//使用p1指针指向"MyArray[]"

  p2=&p1;//将p1指针变量的地址保存到p2中

  p3=&p2;//将p2指针变量的地址保存到p3中

  for(i=0;i<5;i++)//修改数组中的数据

  {

    ***p3=***p3+1;//"***p3"是"**p3"指向的存储数据

    (**p3)++;

    //这里需要用小括号

   //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的

  }

  Print_MyArray(MyArray,5);//打印数组数据

  p1=&MyArray[4];//使用p1指针指向"MyArray[4]"

  p2=&p1;//将p1指针变量的地址保存到p2中

  p3=&p2;//将p2指针变量的地址保存到p3中

  printf("*p1 =%d\r\n",*p1);

  printf("**p2=%d\r\n",**p2);

  printf("***p3=%d\r\n\r\n",***p3);

  printf("The first address of MyArray[] =0x%p\r\n",MyArray);

  printf("p1  = 0x%p\r\n",p1);//打印p1的值

  printf("*p2 = 0x%p\r\n",*p2);//打印p2的"指针值"

  printf("**p3 = 0x%p\r\n\r\n",**p3);//打印p3的"指针值"

  printf("The address of p1 is 0x%p\r\n",&p1);//打印"指针变量p1"的地址

  printf("The value of p2 is 0x%p\r\n\r\n",p2);//打印p2的值

  printf("The address of p2 is 0x%p\r\n",&p2);//打印"指针变量p2"的地址

  printf("The value of p3 is = 0x%p\r\n\r\n",p3);//打印p3的值

  return 0;

}

#include 

//函数功能:打印数组数据
void Print_MyArray(int *array, int size)
{
  int i;
//打印数组开始/
  for(i=0;i

 5、程序运行结果:

C语言指针_第1张图片

6、总结

一维指针可以直接指向某个存储单元

二维指针必须通过一维指针这个桥梁,才可以到达指向某个存储区;因此,只能间接指向某个存储单元。 

三维指针,必须经过二维指针和一维指针,也是通过桥梁的方式,才可以访问某个存单元。

 

  p1=MyArray;//使用p1指针指向"MyArray[]"

  p2=&p1;//将p1指针变量的地址保存到p2中

  p3=&p2;//将p2指针变量的地址保存到p3中

  for(i=0;i<5;i++)

  {

    printf("p1  = 0x%p\r\n",p1);//打印p1的值

    printf("*p2 = 0x%p\r\n",*p2);//打印"p2指向p1的值"

    printf("**p3 = 0x%p\r\n",**p3);//打印"p3指向p1的值"

    printf("&p1  = 0x%p\r\n",&p1);//打印p1的地址

    printf("p2  = 0x%p\r\n",p2);//打印p2的值,即p1的地址

    printf("*p3 = 0x%p\r\n",*p3);//打印"p3指向p1的地址"

    printf("&p2  = 0x%p\r\n",&p2);//打印p2的地址

    printf("p3  = 0x%p\r\n\r\n",p3);//打印p3的值,即p2的地址

    (**p3)++;//这里需要用小括号,读取p1的值,然后修改p1的值

    //这里是修改p1的值,但指针变量p1,p2和p3的地址是保持不变的

  }

C语言指针_第2张图片

你可能感兴趣的:(产品研发,c语言,算法,开发语言,二维指针,检验分享,1024程序员节)