二维数组和字符串与指针的关系

指针与多维数组

多维数组地址的表示方法:

二维数组s[3][4]  定义 int s[3][4]={ {0,2,4,6},{1,3,5,7},{9,10,11,12} }

根据以上的一个二维数组的例子,就有如下表示:

注意S代表着二维数组的首地址,s+1代表第一行的首地址,而s[1]代表着第一行第一列的地址,虽然s+1s[1]都是代表着同一个地址,但是他们还是有区别的。比如:*(s[0]+1)是访问第0行第1列的值,既然s=s[0],那么*(s+1)是访问第0行第1列的值这种说法是错误的,因为s+1,s,s+2是每一行数组的首地址,不牵扯到列的概念,所以是行操作。需要进行行转列,将s视为由s[0],s[1],s[2]组成的一维数组,那么,s[0]=*(s+0),所以s[0+1]=*(s+0)+1=&s[0][1],s[i]+j=*(s+i)+j=&s[i][j]

总之:s[1]=s+1是地址上的相等,操作上是不相等的。而

          S[1]=*(s+1)不仅地址是相等的,操作也是相等的。

指向多维数组的指针变量 实例

1
2
3
4
5
6
7
8
9
10
11
# include  <stdio.h>
main()
{
     int  a[ 3 ][ 4 ]={{ 0 , 2 , 4 , 6 },{ 1 , 3 , 5 , 7 },{ 9 , 10 , 11 , 12 }};
     int  *p;
     for (p=a[ 0 ];p<a[ 0 ]+ 12 ;p++)
     {
        if ((p-a[ 0 ])% 4 == 0 ) printf( "\n" );
        printf( "%4d" ,*p);
     }
}

指向由m个元素组成的一维数组的指针变量 实例

1
2
3
4
5
6
7
8
9
10
11
# include  <stdio.h>
main()
{
     int  a[ 3 ][ 4 ]={{ 0 , 2 , 4 , 6 },{ 1 , 3 , 5 , 7 },{ 9 , 10 , 11 , 12 }};
     int  (*p)[ 4 ],i,j;   //数据类型为(*p)[m],p是一个指针变量,指向包含m个元素的一维数组;
                       //p指向的是横坐标的第一个,p+0地址中的值是0,p+1的值是1,p+2的值是9。
     p=a;
     printf( "请输入要输出的数组坐标" );
     scanf( "%d,%d" ,&i,&j);
     printf( "s[%d,%d]=%d\n" ,i,j,*(*(p+i)+j)); //*(p+i)+j是行转列。
}

指向多维数组的指针作为函数参数。实例

 题目:一个班有3个学生,各四门课程,计算总平均分数和第n个学生的成绩。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# include  <stdio.h>
main()
{
     void  average(float *p, int  n);
     void  search(float (*p)[ 4 ], int  n);
     float score[ 3 ][ 4 ]={{ 65 , 75 , 54 , 80 },{ 78 , 90 , 89 , 76 },{ 66 , 76 , 87 , 90 }};
     int  n;
     average(*score, 12 );
     printf( "enter a number to n:\n" );
     scanf( "%d" ,&n);
     search(score,n);
}
void  average(float *p, int  n)
{
    float *p_end=p+n,aver= 0 ;
    for (;p<p_end;p++)
        aver=aver+*p;
    aver=aver/n;
    printf( "Average=%7.2f\n" ,aver);
}
void  search(float (*p)[ 4 ], int  n)
{
   int  i;
   for (i= 0 ;i< 4 ;i++)
       printf( "%7.2f" ,*(*(p+n)+i));
}

指针与字符串

字符数组

1
2
3
4
5
6
# include <stdio.h>
main()
{
    char string[]= "I am a student" ;
    printf( "%s\n" ,string);
}

注意:1:字符数组的长度要加上最后的结尾标志(“\o”);

    (2string数组名代表数组首地址,string+4表示第4个元素的地址

    (3%S表示整体输出,%X表示16进制输出,%C是一个字符。如果是%d,则输出的就是地址。

字符指针

1
2
3
4
5
6
# include <stdio.h>
main()
{
    char *string= "I am a student" ;   //char a[]=” ”,*string; string=a
    printf( "%s\n" ,string);
}

string是指向字符串的指针变量,存放了元素首地址,*在此毫无意义,表示指针类型。

字符数组与字符串指针的区别

1)存储方式:字符数组:分配一个存放元素的单元。

                 字符串指针:分配一个存放元素地址的单元,地址指向元素首地址。不

                             是将整个字符串放到字符指针变量中。

2)赋值方式

字符数组:char str[16]={a,b,c}

          字符串指针: char *str=abc    char *str; str=abc;

3)定义方式:

字符数组:char str[10];scanf(%s,str);  

          字符串指针:char *str,a[10];str=a;scanf(%s,str); 指针str必须得指向一个数组,

          不然就是野指针了。

4)运算方面

字符数组:字符数组名是常量,不能进行运算,不能改变值。如:

             char a[]=abc; a=a+1;这是错误的。

          字符串指针: 指针变量的值是可以改变的,可以进行运算,如++==等操作。

             如:char *a=abc; a=a+1;这是正确的

字符串指针作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# include  "stdio.h"
# include  "string.h"
void  inv(char *s)
{
         for (;*s != '\0' ;s++)
         {
                 if (*s>= 65  && *s<= 90 )
                     *s+= 32 ;
                 else  if  (*s>= 97  && *s<= 122 )
                     *s-= 32 ;
         }
}
main()
{
     char *string,a[ 10 ];
     string=a;
     gets(string);
     inv(string);
     puts(string);
}

这个程序是大小写转换的一个程序 。注意结束标志“\0”中的0是数字0,而不是字母o .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值