11.12
指标与const
char a[]="test";char *b="test";const char *c="test";a[0]='T';b[0]='T'; //未定义行为,一般要加constC[0]='T'; //编译失败a=b; //阵列不能直接赋值a=c; //同上b=a; //合法b=c; //不合法,如果把c给b,那么就可以通过b来修改c,const不能把值给一个能被修改的值c=a; //合法,a会显隐性转型为指标,在转换为带const的指标c=b; //与c=a同理
可以把字元指标转换为const字元指标,从可读可写变为只可读
字串的复制
#include<stdio.h>#include<string.h>int main(){char source[5]="test";char *destination;//浅复制,实则是同一份destination=source; //利用了隐形转型printf("%s\n",destination);return 0;}
使用strcpy来复制字串
#include<stdio.h>#include<string.h>int main(){const char *source="test"; //==char sourse[5]="test"char *destination; //是错误的,没有宣告存字元的空间,而直接存了位置strcpy(destination,source);return 0;}
#include<stdio.h>#include<string.h>int main(){const char *source="test"; //==char sourse[5]="test"char destination[5];strcpy(destination,source); //隐形转型后传进来return 0;}
指标阵列
int v[3];
int *p[3]={&v[0],&v[1],&v[2]};
int v[3];int *p=v;int i;for(i=0;i<3;i++){p[i]=0; //令阵列中的每一个都等于0 ==*p[i]=0;}
指标阵列中可存乱序的阵列位置,可存几个整形的地址,可存几个阵列的开头位置等
int a[4];int b[2];int c[2];int *p[3]={a,b,c} //隐形转型int i,j;for(i=0;i<3;i++){for(j=0;j<2;j++){ //循序存取p[i][j]=0;}}//随机存取p[0][2]=9; //p[0]指a[0],(p[0])[2]就相当于(a[0])[2]==a[2],即a[2]=9p[1][2]=10; //不存在b[2],是未定义行为
阵列的指标
int v[3]={1,2,3};int (*q)[3]=&v;int i,j;for(i=0;i<3;i++){(*q)[i]=0}(*q)[2]=5;
#include<stdio.h>void print(int (*q)[3]);int main(){int v[3]={1,2,3};print(&v);return 0;} //其实就是传递阵列void print(int (*q)[3]){int i;for(i=0;i<3;i++){printf("%d",(*q)[i]);}}
在函式间传递阵列
#include<stdio.h>void print(int (*q)[5]);int main(){int v[5]={1,2,3,4,5};print(&v);return 0;}void print(int (*q)[5]){int i;for(i=0;i<sizeof(*q)/sizeof((*q)[0]);i++){printf("%d",(*q)[i]);}}
