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

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

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

 

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int i;  
  6.     int *p;  
  7.     int a[10] = {1,2,3,4,5,6,7,8,9,10};  
  8.   
  9.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)  
  10.     {  
  11.         printf("%d ",a[i]);  
  12.     }  
  13.     printf("\n");  
  14.   
  15.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)  
  16.     {  
  17.         printf("%d ",*(a + i));  
  18.     }  
  19.     printf("\n");  
  20.   
  21. #if 0  
  22.     for(i = 0;i < sizeof(a)/sizeof(a[0]);i ++)  
  23.     {  
  24.         printf("%d ",*a ++);//错误,a标识数组的首地址,是一个地址常量,不能改变  
  25.     }  
  26.     printf("\n");  
  27. #endif   
  28.       
  29.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)  
  30.     {  
  31.         printf("%d ",p[i]);  
  32.     }  
  33.     printf("\n");  
  34.   
  35.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)  
  36.     {  
  37.         printf("%d ",*p ++);  
  38.     }  
  39.     printf("\n");  
  40.       
  41.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0]);i ++)  
  42.     {  
  43.         printf("%d ",*(p + i));  
  44.     }  
  45.     printf("\n");  
  46.       
  47.     return 0;  
  48. }  

 

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

 

char *string = "hello word";

 

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

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

 

练习:

char *string1 = "asdfgh";

char *string2 = "efghi";

char buf[1024];

 

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

 

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

{

 

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

       {

              if(*p == *q)

                     break;

       }

 

       if(*p== '\0')

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

 

}

 

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     char *p,*q;  
  6.     int count = 0;  
  7.     char buf[1024];  
  8.     char *string1 = "asdfgh";  
  9.     char *string2 = "efghi";  
  10.   
  11.     printf("sizeof(string1) : %d\n",sizeof(string1));  
  12.     printf("sizeof(*string1) : %d\n",sizeof(*string1));  
  13.   
  14.     for(p = string1; *p != '\0';p ++)  
  15.     {  
  16.         for(q = string2; *q != '\0';q ++)  
  17.         {  
  18.             if(*q == *p)  
  19.                 break;  
  20.         }  
  21.   
  22.         if(*q == '\0')  
  23.         {  
  24.             buf[count ++] = *p;  
  25.         }  
  26.     }  
  27.   
  28.     for(p = string2; *p != '\0';p ++)  
  29.     {  
  30.         for(q = string1; *q != '\0';q ++)  
  31.         {  
  32.             if(*q == *p)  
  33.                 break;  
  34.         }  
  35.   
  36.         if(*q == '\0')  
  37.         {  
  38.             buf[count ++] = *p;  
  39.         }  
  40.     }  
  41.   
  42.     buf[count] = '\0';  
  43.   
  44.     printf("buf : %s\n",buf);  
  45.   
  46.     return 0;  
  47. }  

三 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)

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

 

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int i = 0;  
  6.     int j = 0;  
  7.     int a[3][3] = {1,2,3,4,5,6,7,8,9};  
  8.   
  9.     for(i = 0;i < 3;i ++)  
  10.     {  
  11.         for(j = 0;j < 3;j ++)  
  12.         {  
  13.             printf("%d ",a[i][j]);  
  14.         }  
  15.         printf("\n");  
  16.     }  
  17.   
  18.     printf("--------------------------\n");  
  19.   
  20.     for(i = 0;i < 3;i ++)  
  21.     {  
  22.         for(j = 0;j < 3;j ++)  
  23.         {  
  24.             printf("%d ",*(a[i] + j));  
  25.         }  
  26.         printf("\n");  
  27.     }  
  28.   
  29.     printf("--------------------------\n");  
  30.   
  31.     for(i = 0;i < 3;i ++)  
  32.     {  
  33.         for(j = 0;j < 3;j ++)  
  34.         {  
  35.             printf("%d ",*(*(a + i) + j));//a[i] <=> *(a + i)  
  36.         }  
  37.         printf("\n");  
  38.     }  
  39.   
  40.     printf("--------------------------\n");  
  41.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)  
  42.     {  
  43.         printf("%d ",*(*a + i));  
  44.     }  
  45.     printf("\n");  
  46.       
  47.     int *p;  
  48.   
  49.     printf("--------------------------\n");  
  50.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)  
  51.     {  
  52.         printf("%d ",*p ++);// *p , p = p + 1  
  53.     }  
  54.     printf("\n");  
  55.   
  56.     printf("--------------------------\n");  
  57.       
  58.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)  
  59.     {  
  60.         printf("%d ",p[i]);//*(p + i)  
  61.     }  
  62.     printf("\n");  
  63.   
  64.     printf("--------------------------\n");  
  65.       
  66.     for(i = 0,p = a[0];i < sizeof(a)/sizeof(a[0][0]);i ++)  
  67.     {  
  68.         printf("%d ",*(p + i));  
  69.     }  
  70.     printf("\n");  
  71.   
  72.     return 0;  
  73. }  

//错误的理解

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];//指针数组

 

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};  
  6.     int (*p)[4];//行指针变量  
  7.   
  8.     p = a;  
  9.       
  10.     p ++;  
  11.   
  12.     printf("%d\n",**p);//此时p是行指针类型,*p将行指针变列指针   
  13.      //* (*p) 此时从列指针的地址取值  
  14.   
  15.     p = a;  
  16.   
  17.     printf("%d\n", *(p[2] + 1));  
  18.   
  19.     printf("%d\n", *(*(p + 2) + 1));  
  20.       
  21.     return 0;  
  22. }  

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

int (*p)[4];

 

p = a;

 

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

 

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

 

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

 

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

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

(之少5中输出方法)

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int j;  
  6.     int i = 0;  
  7.     int a[3][4];  
  8.     int (*p)[4];  
  9.   
  10.     printf("Input : ");  
  11.   
  12.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)  
  13.     {  
  14.         scanf("%d",a[0] + i);  
  15.         //scanf("%d",*a + i);  
  16.     }  
  17.       
  18.     p = a;  
  19.   
  20.     for(i = 0;i < 3;i ++)  
  21.     {  
  22.         for(j = 0;j < 4;j ++)  
  23.         {  
  24.             printf("%d ",p[i][j]);  
  25.         }  
  26.         printf("\n");  
  27.     }  
  28.   
  29.     for(i = 0;i < 3;i ++)  
  30.     {  
  31.         for(j = 0;j < 4;j ++)  
  32.         {  
  33.             printf("%d ",*(p[i] + j));  
  34.         }  
  35.         printf("\n");  
  36.     }  
  37.   
  38.     for(i = 0;i < 3;i ++)  
  39.     {  
  40.         for(j = 0;j < 4;j ++)  
  41.         {  
  42.             printf("%d ",*(*(p + i) + j));  
  43.         }  
  44.         printf("\n");  
  45.     }  
  46.       
  47.     for(i = 0;i < sizeof(a)/sizeof(a[0][0]);i ++)  
  48.     {  
  49.         printf("%d ",*(a[0] + i));  
  50.     }  
  51.     printf("\n");  
  52.   
  53.     for(i = 0;i < 3;i ++)  
  54.     {  
  55.         for(j = 0;j < 4;j ++)  
  56.         {  
  57.             printf("%d ",*(*p + j));  
  58.         }  
  59.         p ++;  
  60.         printf("\n");  
  61.     }  
  62.   
  63.     for(i = 0,p = a;i < sizeof(a)/sizeof(a[0][0]);i ++)  
  64.     {  
  65.         printf("%d ",*((int *)p + i));  
  66.       
  67.     }  
  68.     return 0;  
  69. }  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值