11.12

指标与const

  1. char a[]="test";
  2. char *b="test";
  3. const char *c="test";
  4. a[0]='T';
  5. b[0]='T'; //未定义行为,一般要加const
  6. C[0]='T'; //编译失败
  7. a=b; //阵列不能直接赋值
  8. a=c; //同上
  9. b=a; //合法
  10. b=c; //不合法,如果把c给b,那么就可以通过b来修改c,const不能把值给一个能被修改的值
  11. c=a; //合法,a会显隐性转型为指标,在转换为带const的指标
  12. c=b; //与c=a同理

可以把字元指标转换为const字元指标,从可读可写变为只可读

字串的复制

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(){
  4. char source[5]="test";
  5. char *destination;
  6. //浅复制,实则是同一份
  7. destination=source; //利用了隐形转型
  8. printf("%s\n",destination);
  9. return 0;
  10. }

使用strcpy来复制字串

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(){
  4. const char *source="test"; //==char sourse[5]="test"
  5. char *destination; //是错误的,没有宣告存字元的空间,而直接存了位置
  6. strcpy(destination,source);
  7. return 0;
  8. }
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(){
  4. const char *source="test"; //==char sourse[5]="test"
  5. char destination[5];
  6. strcpy(destination,source); //隐形转型后传进来
  7. return 0;
  8. }

指标阵列

int v[3];

int *p[3]={&v[0],&v[1],&v[2]};

  1. int v[3];
  2. int *p=v;
  3. int i;
  4. for(i=0;i<3;i++){
  5. p[i]=0; //令阵列中的每一个都等于0 ==*p[i]=0;
  6. }

指标阵列中可存乱序的阵列位置,可存几个整形的地址,可存几个阵列的开头位置等

  1. int a[4];
  2. int b[2];
  3. int c[2];
  4. int *p[3]={a,b,c} //隐形转型
  5. int i,j;
  6. for(i=0;i<3;i++){
  7. for(j=0;j<2;j++){ //循序存取
  8. p[i][j]=0;
  9. }
  10. }
  11. //随机存取
  12. p[0][2]=9; //p[0]指a[0],(p[0])[2]就相当于(a[0])[2]==a[2],即a[2]=9
  13. p[1][2]=10; //不存在b[2],是未定义行为

阵列的指标

  1. int v[3]={1,2,3};
  2. int (*q)[3]=&v;
  3. int i,j;
  4. for(i=0;i<3;i++){
  5. (*q)[i]=0
  6. }
  7. (*q)[2]=5;
  1. #include<stdio.h>
  2. void print(int (*q)[3]);
  3. int main(){
  4. int v[3]={1,2,3};
  5. print(&v);
  6. return 0;
  7. } //其实就是传递阵列
  8. void print(int (*q)[3]){
  9. int i;
  10. for(i=0;i<3;i++){
  11. printf("%d",(*q)[i]);
  12. }
  13. }

在函式间传递阵列

  1. #include<stdio.h>
  2. void print(int (*q)[5]);
  3. int main(){
  4. int v[5]={1,2,3,4,5};
  5. print(&v);
  6. return 0;
  7. }
  8. void print(int (*q)[5]){
  9. int i;
  10. for(i=0;i<sizeof(*q)/sizeof((*q)[0]);i++){
  11. printf("%d",(*q)[i]);
  12. }
  13. }