一、字符数组。
1、什么是字符数组?
在一个数组中,每一个成员都是一个字符
例如: char A[3] --> 每一个成员都是字符类型的数据,组成一个字符串。
2、字符数组的赋值?
char A[10] = {'h','e','l','l','o'}; --> 剩余没有赋值的5个成员的值都是十进制的0。 --> 等价于 5个'\0’
char A[10] = {"hello"}; --> 将字符串"hello"赋值给数组。
char A[10] = "hello"; --> 与第2种写法一致,{}可以省略。
3、思考题。
1)char A[10] = {"10086"}; 与 int A[10] = {1,0,0,8,6}; 有什么区别?
char A[10] = {"10086"} -> 其实这10086这几个数字是一些字符来的 等价于 char A[10] = {'1','0','0','8','6'};
char A[10] = {49,48,48,56,54};
int A[10] = {1,0,0,8,6}; -> 这些10086数字都是十进制的数字。
2)请问能不能这样写?
int A[10] = "10086"; --> 不可以将字符串直接赋值给一个整型数组。
int A[10] = {'1','0','0','8','6'}; --> 正确,等价于 int A[10] = {49,48,48,56,54};
4、从内存角度分析以下的问题。
char A[10] = {'h','e','l','l','o'};
与
char A[10] = {"hello"};
详细区别: 字符数组赋值的区别.jpg
二、字符指针。
1、什么是字符指针?
指向一个字符变量的地址就是字符指针。
例如:
int a;
int *pa = &a; --> pa是整型指针,这个指针指向整型变量a。
char b;
char *pb = &b; --> pb是字符指针,这个指针指向字符变量b。
2、有时候,我们会看到一个字符串赋值给一个字符指针?
char *p = "helloworld"; --> 正确
问题:究竟字符指针p指向字符,还是指向一个字符串?
字符指针永远永远都是指向一个字符,不可能指向字符串的,在该案例中,字符指针p存放着helloworld字符串的第一个元素'h'的地址。
3、关于字符数组与字符指针的问题。
1)请问以下两句话有什么区别?
char A[10] = "hello";
在内存中连续申请10个字节的空间,然后使用变量A间接访问这片内存空间,然后将常量区中的"hello"这个字符串拷贝到变量A对应的空间中。
char *p = "hello";
在内存中连续申请8个字节的空间,然后使用变量p间接访问这片内存空间,然后将常量区中的"hello"的首元素'h'的地址赋值给变量p对应的空间中。
2)每一个字符串都是属于常量区的数据,而每一个字符串在常量区都会以'\0'作为结束标志。
所以拷贝字符串时,是连'\0'一起拷贝。
3)%s --> 输出字符串。
输出原则:
给定一个地址,判断该地址上的字符是不是\0
如果不是'\0',则打印该字符,并将地址往后挪动一个单位,再继续判断。
如果是'\0',则结束打印。
#include <stdio.h>
int main(int argc,char *argv[])
{
char A[10] = "hello";
char *p = "hello";
printf("A = %s\n",A); //hello
printf("p = %s\n",p); //hello
A[2] = '\0';
printf("A = %s\n",A); //he
p[2] = '\0'; //p[2] = *(p+2) //不可以给常量赋值
printf("p = %s\n",p);
return 0;
}
练习: 指针习题(C语言).doc 14 16 17