9.7 字符串的指针和指向字符串的指针变量
- 一.字符串表示形式
- 二.字符串指针做函数参数
- 1.数组名做函数参数
- 2.数组指针做函数参数
- 三.字符指针变量与字符数组
- (1)字符数组是由若干个元素组成,每个元素中存放一个字符。
- (2)赋值方式
- (3)指针比哪里的值的可以改变
- 四、学习来源
一.字符串表示形式
int main()
{
char mystr1[] = "I love China!"; //拷贝
char mystr2[] = "I love China!";//拷贝
printf("%s\n",mystr1);
printf("%s\n",mystr2);
return 0;
}
mystr1 == mystr1[0]
mystr2 == mystr2[0]
地址不同
int main()
{
char *pmystr1 = "I love China!";//不是拷贝,本行相当于把内存中这个字符串常量的首地址赋给了指针变量pmystr1;
char *pmystr2 = "I love China!";//字符串常量的首地址赋给了指针变量pmystr2
printf("%s\n",mystr1);
printf("%s\n",mystr2);
return 0;
}
地址相同
C语言中对字符串常量有特殊的处理:在内存中开辟一段类似字符数组的东西来存放字符串常量。
所以"I love China"是存在于内存中,并且有一个内存地址的;
int main()
{
char a[] = "I love China!";
char b[100]; // 保证比a字符数组长
int i;
for(i = 0; *(a+i) != '\0' ;i++) //*(a + i)相当于a[i]; '\0'字符串结束标志
{
*(b+i) = * (a +i); //b[i] = a[i];
}
*(b+i) = '\0'; // b[i] = '\0';
printf("string a is %s\n",a);
printf("string b is %s\n",b);
return 0;
}
int main()
{
char a[] = "I love China!";
char b[100]; // 保证比a字符数组长
char *p1,*p2; //字符型指针变量
int i;
p1 = a;
p2 = b;
for(; *p1 != '\0' ;p1++,p2++) //刚开始循环时, p1指向 a[0],也就是p1 = &a[0];
{
*p2 = *p1; //b[0] = a[0];
}
*p2 = '\0'; // b[i] = '\0';
printf("string a is %s\n",a);
printf("string b is %s\n",b);
return 0;
}
二.字符串指针做函数参数
1.数组名做函数参数
void copystr(char from[],char to[]) //字符数组名做参数,将实参首地址传递给from,to,所以from和a指向了同一个单元,to就和b指向同一个单元
{
int i = 0;
while(from[i] != '\0')
{
to[i] = from[i]; //逐个字符拷贝,必须保证to比from大
i++;
}
to[i] = '\0';
}
int main()
{
char a[] = "this is source content";
char b[] = "this is a special text hehe,lokk carefully"; //必须保证b比a大,因为后续a内容要往b里拷贝。
copystr(a,b);
printf("a = %s\n",a);
printf("b= %s\n",b);
return 0;
}
2.数组指针做函数参数
void copystr(char *from,char *to) //字符数组名做参数,将实参首地址传递给from,to,所以from和a指向了同一个单元,to就和b指向同一个单元
{
int i = 0;
while(from[i] != '\0')
{
to[i] = from[i]; //逐个字符拷贝,必须保证to比from大
i++;
}
to[i] = '\0';
}
int main()
{
char a[] = "this is source content";
char b[] = "this is a special text hehe,lokk carefully"; //必须保证b比a大,因为后续a内容要往b里拷贝。
copystr(a,b);
printf("a = %s\n",a);
printf("b= %s\n",b);
return 0;
}
void copystr(char *from,char *to) //字符数组名做参数,将实参首地址传递给from,to,所以from和a指向了同一个单元,to就和b指向同一个单元
{
int i = 0;
for(;*from != '\0';from++,to++)
{
*to = *from; //b[i] = a[i];
}
to[i] = '\0';
}
int main()
{
char a[] = "this is source content";
char b[] = "this is a special text hehe,lokk carefully"; //必须保证b比a大,因为后续a内容要往b里拷贝。
copystr(a,b);
printf("a = %s\n",a);
printf("b= %s\n",b);
return 0;
}
void copystr(char *from,char *to) //字符数组名做参数,将实参首地址传递给from,to,所以from和a指向了同一个单元,to就和b指向同一个单元
{
int i = 0;
while(*from)
{
*to++ = *from++; b[i] = a[i];之后 i++;
}
to[i] = '\0';
}
int main()
{
char a[] = "this is source content";
char b[] = "this is a special text hehe,lokk carefully"; //必须保证b比a大,因为后续a内容要往b里拷贝。
copystr(a,b);
printf("a = %s\n",a);
printf("b= %s\n",b);
return 0;
}
三.字符指针变量与字符数组
(1)字符数组是由若干个元素组成,每个元素中存放一个字符。
而字符指针变量中存放的是字符串的首地址。仅仅是首地址,不是字符数组的内容放到字符指针变量中。
(2)赋值方式
char str[100] = "I love China!"; //定义时初始化,相当于拷贝字符串内容到str中
这种写法错误:
char str[100];
str = “I love China!”;
正确写法:
char str[100];
strcpy(str,"I love China!");
char *a;
a = "I love China!"; // "I love China!"是字符串常量,在内存中是有固定地址的,这里赋值只是让字符指针a指向这个地址而已;
(3)指针比哪里的值的可以改变
char *a = " I love China!";
a = a+7; //指针变量值可以改变
printf("a = %s\n",a); //China!
char a[] = “I love China!”;
a = a +7; //数组首地址是不可以改变的
四、学习来源
整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记