Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37376
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-16 19:30
个人简介

嵌入式Linux编程 Android软件开发

文章分类

全部博文(16)

文章存档

2015年(16)

分类: C/C++

2015-04-30 23:30:07

C语言一级指针变量与一维数组

 

int data[5];

int *p;

 

p = data;

 

p[i] <=> data[i] <=> *(p + i) <=> *(data + i)

 

注意:指针变量在保存了数组的首地址后,可以当作数组名来使用,不同的地方在于指针变量是一个变量,

可以改变它的值,而数组名是一个地址常量,不能更改它的值。

 

 

更深的理解:

data[i]访问数组中第i个成员,实际是通过  "数组首地址 + 成员偏移找到数组的成员

=>*(data + i);

 

data , &data[0],&data 

他们的值是相等的,但是含义不一样

data是数组名,它只是标示数组的首地址

&data[0]标示获取数组第一个成员的地址

&data是取整个数组的地址(把它当作一种构造类型来处理)

 

练习:

int a[10] = {1,2,3,4,5,6,7,8,9,10};

输出这个数组的内容,四中形式


点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i;
  5.     int *p;
  6.     int a[10] = {1,2,3,4,5,6,7,8,9,10};

  7.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  8.     {
  9.         printf("%d ",a[i]);
  10.     }
  11.     printf("\n");

  12.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  13.     {
  14.         printf("%d ",*(a + i));
  15.     }
  16.     printf("\n");

  17. #if 0
  18.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)
  19.     {
  20.         printf("%d ",*a ++);//错误,a标识数组的首地址,是一个地址常量,不能改变
  21.     }
  22.     printf("\n");
  23. #endif
  24.     
  25.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
  26.     {
  27.         printf("%d ",p[i]);
  28.     }
  29.     printf("\n");

  30.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
  31.     {
  32.         printf("%d ",*p ++);
  33.     }
  34.     printf("\n");
  35.     
  36.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)
  37.     {
  38.         printf("%d ",*(p + i));
  39.     }
  40.     printf("\n");
  41.     
  42.     return 0;
  43. }

 


 

C语言一级指针变量与字符串常量

 

char *string = "hello word";

 

注意:"helloword"此时存放在字符串常量区,指针变量string保存了字符串的首地址,

       字符串常量区内容是不可以修改的。

 

练习:

char *string1 = "asdfgh";

char *string2 = "efghi";

char buf[1024];

 

寻找string1string2不相同的字符,然后存放在buf中,最后将buf的内容输出

 

for(q = string1;*q != '\0';q ++)

{

 

       for(p = string2; *p != '\0';p ++)

       {

              if(*p == *q)

                     break;

       }

 

       if(*p == '\0')

              //肯定'a'不在string2,将它存在buf数组中

 

}

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char *p,*q;
  5.     int count = 0;
  6.     char buf[1024];
  7.     char *string1 = "asdfgh";
  8.     char *string2 = "efghi";

  9.     printf("sizeof(string1) : %d\n",sizeof(string1));
  10.     printf("sizeof(*string1) : %d\n",sizeof(*string1));

  11.     for(p = string1; *p != '\0';p ++)
  12.     {
  13.         for(q = string2; *q != '\0';q ++)
  14.         {
  15.             if(*q == *p)
  16.                 break;
  17.         }

  18.         if(*q == '\0')
  19.         {
  20.             buf[count ++] = *p;
  21.         }
  22.     }

  23.     for(p = string2; *p != '\0';p ++)
  24.     {
  25.         for(q = string1; *q != '\0';q ++)
  26.         {
  27.             if(*q == *p)
  28.                 break;
  29.         }

  30.         if(*q == '\0')
  31.         {
  32.             buf[count ++] = *p;
  33.         }
  34.     }

  35.     buf[count] = '\0';

  36.     printf("buf : %s\n",buf);

  37.     return 0;
  38. }


C语言的指针变量 与 二维数组

 

int a[3][2];

 

a[0][0]  --- a[0]:0行的首地址 ----  a

a[0][1]

---------------------

a[1][0]  --- a[1]:1行的首地址 ----  a + 1

a[1][1]

---------------------

a[2][0]  --- a[2]:2行的首地址 ----  a + 2

a[2][1]

 

行指针(每次 + 1的时候,走动一行的大小)        : a , a + 1 ,a + 2

列指针(每次 + 1的时候,组动一个数据元素的大小): a[0] ,a[1],a[2]

 

行指针  ---( *)---> 列指针

列指针  ---( &)---> 行指针

 

注意:只有在二维数组中,才区分行指针和列指针

 

====================================================================================

练习:获取a[1][1]成员的值,有那些写法?

 

a[1][1], *(&a[1][1]) , 

 

*(a[1] + 1) , *(a[0] + 3) => *(a[0] + 1(相隔的行数) * 2(每行的元素个数) + 1),

 

*(*(a + 1) + 1) ,  *(a[1] + 1)

=====================================================================================

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i = 0;
  5.     int j = 0;
  6.     int a[3][3] = {1,2,3,4,5,6,7,8,9};

  7.     for(i = 0;i < 3;i ++)
  8.     {
  9.         for(j = 0;j < 3;j ++)
  10.         {
  11.             printf("%d ",a[i][j]);
  12.         }
  13.         printf("\n");
  14.     }

  15.     printf("--------------------------\n");

  16.     for(i = 0;i < 3;i ++)
  17.     {
  18.         for(j = 0;j < 3;j ++)
  19.         {
  20.             printf("%d ",*(a[i] + j));
  21.         }
  22.         printf("\n");
  23.     }

  24.     printf("--------------------------\n");

  25.     for(i = 0;i < 3;i ++)
  26.     {
  27.         for(j = 0;j < 3;j ++)
  28.         {
  29.             printf("%d ",*(*(a + i) + j));//a[i] <=> *(a + i)
  30.         }
  31.         printf("\n");
  32.     }

  33.     printf("--------------------------\n");
  34.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
  35.     {
  36.         printf("%d ",*(*a + i));
  37.     }
  38.     printf("\n");
  39.     
  40.     int *p;

  41.     printf("--------------------------\n");
  42.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
  43.     {
  44.         printf("%d ",*p ++);// *p , p = p + 1
  45.     }
  46.     printf("\n");

  47.     printf("--------------------------\n");
  48.     
  49.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
  50.     {
  51.         printf("%d ",p[i]);//*(p + i)
  52.     }
  53.     printf("\n");

  54.     printf("--------------------------\n");
  55.     
  56.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)
  57.     {
  58.         printf("%d ",*(p + i));
  59.     }
  60.     printf("\n");

  61.     return 0;
  62. }


//错误的理解

int **p;

p = a;//a不是一级指针变量的地址,它是数组名,在二维数组中,它是行指针类型

 

练习:

int a[3][3] = {1,2,3,4,5,6,7,8,9};

5中形式输出二维数组的内容

 

=====================================================================================

思考:如何定义一个行指针类型变量?

 

数据类型 (*行指针变量名)[一行元素的个数];

 

int (*p)[3];//行指针变量p,每次+1 ,每次走动3 int型数据大小

int *p[3];//指针数组

 

练习:如何定义一个指针变量保存数组int a[3][4]的首地址a?

int (*p)[4];

 

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
  5.     int (*p)[4];//行指针变量

  6.     p = a;
  7.     
  8.     p ++;

  9.     printf("%d\n",**p);//此时p是行指针类型,*p将行指针变列指针
  10.      //* (*p) 此时从列指针的地址取值

  11.     p = a;

  12.     printf("%d\n", *(p[2] + 1));

  13.     printf("%d\n", *(*(p + 2) + 1));
  14.     
  15.     return 0;
  16. }


p = a;

 

a[i][j] <=>p[i][j] <=> *(a[i] + j) <=> *(p[i] + j) <=> *(*(a + i) + j) <=> *(*(p+i) + j)

 

此时pa的区别,p是一个变量,可以改变,a是一个地址常量不能改变.

 

p ++; //移动16字节,4int数据

 

======================================================================================

练习:给一个三行4列的二维数组输入值(从键盘上输入),然后用一个行指针变量输出而维数组的内容

(之少5中输出方法)

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int j;
  5.     int i = 0;
  6.     int a[3][4];
  7.     int (*p)[4];

  8.     printf("Input : ");

  9.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
  10.     {
  11.         scanf("%d",a[0] + i);
  12.         //scanf("%d",*a + i);
  13.     }
  14.     
  15.     p = a;

  16.     for(i = 0;i < 3;i ++)
  17.     {
  18.         for(j = 0;j < 4;j ++)
  19.         {
  20.             printf("%d ",p[i][j]);
  21.         }
  22.         printf("\n");
  23.     }

  24.     for(i = 0;i < 3;i ++)
  25.     {
  26.         for(j = 0;j < 4;j ++)
  27.         {
  28.             printf("%d ",*(p[i] + j));
  29.         }
  30.         printf("\n");
  31.     }

  32.     for(i = 0;i < 3;i ++)
  33.     {
  34.         for(j = 0;j < 4;j ++)
  35.         {
  36.             printf("%d ",*(*(p + i) + j));
  37.         }
  38.         printf("\n");
  39.     }
  40.     
  41.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)
  42.     {
  43.         printf("%d ",*(a[0] + i));
  44.     }
  45.     printf("\n");

  46.     for(i = 0;i < 3;i ++)
  47.     {
  48.         for(j = 0;j < 4;j ++)
  49.         {
  50.             printf("%d ",*(*p + j));
  51.         }
  52.         p ++;
  53.         printf("\n");
  54.     }

  55.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0][0]);i ++)
  56.     {
  57.         printf("%d ",*((int *)p + i));
  58.     
  59.     }
  60.     return 0;
  61. }


阅读(994) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~