> 文章列表 > 9.7 字符串的指针和指向字符串的指针变量

9.7 字符串的指针和指向字符串的指针变量

9.7 字符串的指针和指向字符串的指针变量

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]

地址不同
9.7 字符串的指针和指向字符串的指针变量

int main()
{char *pmystr1 = "I love China!";//不是拷贝,本行相当于把内存中这个字符串常量的首地址赋给了指针变量pmystr1;char *pmystr2 = "I love China!";//字符串常量的首地址赋给了指针变量pmystr2printf("%s\\n",mystr1);printf("%s\\n",mystr2);return 0;
}

地址相同
9.7 字符串的指针和指向字符串的指针变量
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;
}

9.7 字符串的指针和指向字符串的指针变量

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;
}

9.7 字符串的指针和指向字符串的指针变量

二.字符串指针做函数参数

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;
}

9.7 字符串的指针和指向字符串的指针变量

三.字符指针变量与字符数组

(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的笔记