二維數組和字符串與指針的關系


指針與多維數組

多維數組地址的表示方法:

二維數組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)不僅地址是相等的,操作也是相等的。

指向多維數組的指針變量 實例

1234567891011 #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個元素組成的一維數組的指針變量 實例

1234567891011 #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個學生的成績。

1234567891011121314151617181920212223242526 #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));}

指針與字符串

字符數組

123456 #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,則輸出的就是地址。

字符指針

123456 #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;這是正確的

字符串指針作為函數參數

1234567891011121314151617181920 #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 .


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: