11.12
指标与const
char a[]="test";
char *b="test";
const char *c="test";
a[0]='T';
b[0]='T'; //未定义行为,一般要加const
C[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]=9
p[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]);
}
}