数组与指针

来源:互联网 发布:cf号怎么解封软件 编辑:程序博客网 时间:2024/06/04 18:40

1、字符串
c语言中没有像java中的String类型,但是有char类型,所以
写法一: char str[]="abcdefg";
字符串在定义中,最后有个默认不显示的’\0’,代表结束该段字符串。
写法二:char * str2="abcdefg";
这种写法代表字符串常量,会放到常量池中,随时准备复用,验证一下?

  char str[]="abcdefg";  char * str2="abcdefg";  char * str3="abcdefg";  printf("%p\n",str);  printf("%p\n",str2);  printf("%p\n",str3);

结果是:

0060FF480040300000403000

可以看到str2 和str3的地址是一样的哦!

上面中的 str 、str2、str3代表的是字符串的首地址,例如:

  char str[]="abcdefg";  char * str2="abcdefg";  char * str3="abcdefg";  printf("%s\n",str);  printf("%s\n",str2);  printf("%s\n",str3);//从字符串首地址一直到'\0'的位置

结果是:

abcdefgabcdefgabcdefg

而 *str 、*str2 、*str3 、*str4 代表取出字符串中的第一个字符

  char str[]="abcdefg";  char * str2="abcdefg";  char * str3="abcdefg";  char str4[]={'a','b','c','d','e','f','g','\0'};  printf("%c\n",*str);  printf("%c\n",*str2);  printf("%c\n",*str3);//从字符串首地址一直到'\0'的位置  printf("%c\n",*str4);

结果:

aaaa

&str 和 str的区别

  char str[]="abcdefg";  char * str2="abcdefg";  char * str3="abcdefg";  char str4[]={'a','b','c','d','e','f','g','\0'};  printf("%c\n",*(str+1));  printf("%c\n",*str2);  printf("%c\n",*str3);//从字符串首地址一直到'\0'的位置  printf("%c\n",*(str4+2));  /*&str代表字符串数组的整个地址,str代表的是字符串的首个字符地址,   * str+1 代表:str+sizeof(*str)   * &str+1 代表:&str+sizeof(*&str)   */

结果:

baac

char * str 和 char str[]区别

  char str[]="abcdefg";  char * str2="abcdefg";  char * str3="abcdefg";  char str4[]={'a','b','c','d','e','f','g','\0'};  printf("改变前:%s\n",str);  printf("%c\n",*str2);  printf("%c\n",*str3);//从字符串首地址一直到'\0'的位置  printf("%c\n",*(str4+2));  change(str);  /*传递数组的引用   *   */  printf("改变后:%s\n",str);  change2(str);  printf("改变后2:%s\n",str);}/* * char * str 和 char str[] 代表都是字符串数组,char str[]编译后就是 char * str */void change(char * str){    *str='b';}void change2(char str[]){    *str='c';}

结果:

改变前:abcdefgaac改变后:bbcdefg改变后2:cbcdefg

2、数组
总结过上面的字符串其实数组也没啥东西了

    //数组作为形参时,可以是int * arr 也可以是int arr[],但是不能直接像字符串那样 int * arr={};    //这样是错误的    int arr[]={1,2,3,4,5,6};    int arr2[6]={1,2,3,4,5,6};    int arr3[6];    arr3[0]=1;    arr3[1]=2;    printf("%d\n",*arr);    printf("%d\n",*arr2);    printf("%d\n",*arr3);    //二维数组 行数可以不写,因为它自己就可以知道数量,例如定义一维数组时,但是列数必须写。    int arr4[][4]={{1,2,3,4},{5,6,7,8}};    //(*arr4)代表{1,2,3,4}的首地址,*(*arr4)取出{1,2,3,4}的第一个元素    printf("%d\n",*(*arr4));

结果:

1111

指针数组

    //指针数组 顾名思义 存储指针的数组    int a=10;    int * arr[3];    arr[0]=&a;    printf("%p\n",*arr);

结果:

0060FF44

数组地址和数组元素首地址的区别

//     int * arr=(int *)malloc(5*sizeof(int)); 申请5int大小的内存资源 可以像使用数组一样给其赋值:例如:arr[0]=1;或者*arr=1;       int arr[2];       arr[0]=9;       arr[1]=8;//     arr[2]=7;//     arr[3]=6;//     arr[4]=5;       int * ap=(int *)(&arr+1);//&arr+sizeof(*&arr) 代表加上了一个数组的长度       printf("%d\n",sizeof(int));       printf("%p\n",arr);       printf("%p\n",&arr);       printf("%p\n",ap);       printf("%d\n",*arr);       printf("%d\n",*(ap-1));//ap-sizeof(int) 减去数组中一个元素的长度 就得到了数组的最后一个元素的地址

结果:

40060FF480060FF480060FF5098
1 0
原创粉丝点击