内存存储
字符数组与字符串的区别:它们最根本的区别是在内存中的存储区域不一样。
- 字符数组存储在全局数据区或栈区,全局数据区和栈区的字符串(也包括其他数据) 有读取和写入的权限,
- 字符串存储在常量区。常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
定义区别
char string[] = "abcde";
char charArr[] = {'a','b','c','d','e'}
char c = 'a'
- 数组:charArr[] = {‘a’,’b’,’c’,’d’,’e’}
长度
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int size = 0;
int len = 0;
// buf作为字符串数组 应该是5个字节 作为字符串4个字节
char buf[] = "abcd";
char buf3[100] = "ABCDEFG123"; //自动补充0
len = strlen(buf); // 4
size = sizeof(buf); // 5
printf("len = %d\n", len); // 4
printf("size = %d\n", size); // 5
printf("buf: %s\n", buf); // buf:abcd
printf("buf3: %s\n", buf3); // buf3:ABCDEFG123
printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0
system("pause");
return;
}
通过数组下标 和 指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main1()
{
int size = 0;
int len = 0;
// buf作为字符串数组 应该是5个字节 作为字符串4个字节
char buf[] = "abcd";
char buf3[100] = "ABCDEFG123"; //自动补充0
len = strlen(buf); // 4
size = sizeof(buf); // 5
printf("len = %d\n", len); // 4
printf("size = %d\n", size); // 5
printf("buf: %s\n", buf); // buf:abcd
printf("buf3: %s\n", buf3); // buf3:ABCDEFG123
printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0
system("pause");
return;
}
void main()
{
int i = 0;
char *p = NULL;
char buf[100] = "ABCDE";
printf("%p\n", buf);
/*
0x0041F708 41 A
0x0041F709 42 B
0x0041F70A 43 C
0x0041F70B 44 D
0x0041F70C 45 E
0x0041F70D 00 .
*/
// 数组下标形式
for (i = 0; i < strlen(buf); i++) {
//printf("buf[%d]=%d\n", i, buf[i]);
/*
buf[0]=65
buf[1]=66
buf[2]=67
buf[3]=68
buf[4]=69
*/
printf("buf[%d]=%c\n", i, buf[i]);
/*
buf[0]=A
buf[1]=B
buf[2]=C
buf[3]=D
buf[4]=E
*/
}
// 指针
p = buf; // buf代表数组首元素的地址
for (i = 0; i < strlen(buf); i++) {
printf("buf[%d]=%c\n", i, *p++); // 这里是步长+1
/*
buf[0]=A
buf[1]=B
buf[2]=C
buf[3]=D
buf[4]=E
*/
}
// [] *的推导过程
// buf[i] ===>buf[0+i] ===> *(buf+i)
system("pause");
return;
}
输出
#include<stdio.h>
#include<stdlib.h>
//http://tool.oschina.net/commons?type=4 常用对照表
void main() {
printf("\n-------------------字符-------------------\n");
/**
字符 putchar printf 对应的格式控制符是%c。
*/
int one = 1;
char first = '1';
char code = 'A';
char b = 70;
int c = 71;
//char x = '中'; //char 类型不能包含 ASCII 编码之外的字符
putchar(one);
putchar(first);
putchar("\n");
printf("%d\t %c\n", one, one); // 1 SOH %dASCII码值1 %c ASCII码控制字符SOH
printf("%d\t %c\n", first, first); // 49 1 %dASCII码值49 %c ASCII码控制字符1
printf("%d\t %c\n", code, code); // 65 A %dASCII码值65 %c ASCII码控制字符A
printf("%d\t %c\n", b, b); // 70 F %dASCII码值65 %c ASCII码控制字符A
printf("%d\t %c\n", c, c); // 71 G %dASCII码值65 %c ASCII码控制字符A
char p1, p2;
p1 = 120;
p2 = 121;
printf("%c,%c\n", p1, p2);
printf("%d,%d\n", p1, p2);
printf("\n-------------------字符串-------------------\n");
// 字符串 puts 函数和通用的 printf 对应的格式控制符是%s。
// 在C语言中,字符串总是以'\0'作为串的结束符。
char web_url[] = "http://c.biancheng.net";
char *web_name = "C语言中文网";
puts(web_url); // http://c.biancheng.net
puts(web_name); //C语言中文网
printf("%s\n", web_url); // http://c.biancheng.net
printf("%s\n", web_name); //C语言中文网
printf("\n-------------------字符数组-------------------\n");
char arrCh[] = { 'A','B','1', '中' };
for (int i = 0; i < 4; i++) {
printf("i=%c\t", arrCh[i]); // i=A i=B i=1 i=? '中'是打印不出来的 ASCII码表里不存在
}
system("pause");
return 0;
}