- 1.字符串相关
- C语言中没有字符串,用 字符数组 创造出字符串出来。
# include <stdio.h>
# include <string.h>
int main(int argc, char const *argv[])
{
// 字符类型,用1个字节来存储。
char v1 = 'w';
printf("v1: %c\n", v1);
// 字符数组 -> 字符串
char v2[8] = {'x','i','a','o','w','l','i','\0'};
printf("v2: %s\n", v2);
// 字符数组, sizeof大小
char v3[] = "xiaowli";
int length = sizeof(v3)/sizeof(char);
printf("v3: %s,长度为:%d\n", v3, length);
// 字符数组
char v4[] = "周杰伦";
int len = sizeof(v4)/sizeof(char);
printf("v4: %s,长度为:%d\n", v4, len);
// 字符串长度
unsigned long dataLen = strlen(v4);
printf("Length: %d\n", dataLen);
return 0;
}
//v1: w
//v2: xiaowli
//v3: xiaowli,长度为:8
//v4: 周杰伦,长度为:10
//Length: 9
- 2.数组相关
- 对于数组来说,内部元素是挨个存放,内存地址相邻;
- 元素固定;
- 类型固定。
# include <stdio.h>
int main(int argc, char const *argv[]) {
int v3[] = {11, 22, 33, 44, 55, 66}; // 每个整型4字节
printf("第0个位置值:%d,内存地址:%p \n", v3[0], &v3[0]); // 值所在的内存地址 0x00000
printf("第1个位置值:%d,内存地址:%p \n", v3[1], &v3[1]); // 0x00004
printf("第2个位置值:%d,内存地址:%p \n", v3[2], &v3[2]); // 0x00008
return 0;
}
- 数组变量,也是(指向)也是数组第一个元素的内存地址。
# include <stdio.h>
int main(int argc, char const *argv[]) {
// 字符数组
char v3[] = {'x', 'w', 'l', 'i', 'a', 'n', 'g'};
printf("v3的值为: %p \n", v3);
printf("v3的值为: %p \n", &v3);
printf("v3的值为: %p \n", &v3[0]);
printf("v3的值为: %p \n", &v3[1]);
return 0;
}
- 3.指针(重点)
- 3.1:什么是指针?
- 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var_name;
- 在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。用来声明指针的星号 *
- 3.2:示例1
#include <stdio.h>
int main() {
int v1 = 666;
int* v2 = &v1;
printf("v1对应的值:%d,内存地址是:%p \n", v1, &v1);
printf("v2对应的值:%p,内存地址是:%p \n", v2, &v2);
return 0;
}
- 3.3:示例2,通过指针获取对应的值并且修改
- 如果你有一个指针类型的变量v2,内部存储肯定是内存地址,如何获取次内存地址中存储的值呢?
- 注意:
&变量
,获取变量指向数据的内存地址。*变量
,根据变量中存储的内存地址去获取次内存地址中存储的值。
#include <stdio.h>
int main() {
int v1 = 666;
int* v2 = &v1;
int* v3 = &v1;
v1 = 999;
printf("v2指针关联的值:%d \n", *v2); //999
printf("v3指针关联的值:%d \n", *v3); //999
*v2 = 888;
printf("v1的值:%d \n", v1);
printf("v2指针关联的值:%d \n", *v2); //888
printf("v3指针关联的值:%d \n", *v3);
return 0;
}
- 3.4:指针类型也支持计算
#include <stdio.h>
int main() {
char v34[] = {'a', 'e', 'x'};
char *v28 = v34;
//char *v28 = &v34;
printf("v34的值:%c,内存地址:%p \n", v34[0], &v34[0]);
printf("v34的值:%c,内存地址:%p \n", v34[1], &v34[1]);
printf("v34的值:%c,内存地址:%p \n", v34[2], &v34[2]);
printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
v28 += 1;
printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
v28 += 1;
printf("v28的值:%p,对应地址的值:%c \n", v28, *v28);
return 0;
}
- 3.5格式化
#include <stdio.h>
int main() {
char v34[10]; // ['6','1','7','3','6','2',,,,,]
char *v28 = v34;
// 格式化:
sprintf(v28, "%02x", 'a'); // 'a' -> ascii 97 -> "61" -> ['6','1']
v28 += 2;
sprintf(v28, "%02x", 's'); // 115
v28 += 2;
sprintf(v28, "%02x", 'b'); // 98
printf("值为:%s", v34);
return 0;
}
- 3.6:判断子序列
#include <stdio.h>
#include <string.h>
int main() {
char name[] = "xwliang";
// 判断是name中是否存在子序列li
char *res = strstr(name, "pe");
if (res == NULL) {
printf("不存在");
}else{
printf("存在,从位置 %p 匹配成功的\n",res);
}
return 0;
}
- 3.7:开辟内存
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main() {
char name[] = "xwliang";
printf("原来的的内容为:%s,内存地址:%p \n", name, name);
// 开辟内存 "xwliang"
char *newName = malloc(strlen(name) + 1);
strcpy(newName, name); // 拷贝
printf("拷贝后的内容为:%s,内存地址:%p\n", newName, newName);
return 0;
}
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main() {
char name[] = "json";
char role[] = "sb";
//char v23 = [11];
char *v23 = malloc(strlen(name) + strlen(role) + strlen(name) + 1);
strcpy(v23, name);
strcat(v23, role);
char *v24 = v23;
strcat(v24, name);
printf(v23); //jsonsbjson
return 0;
}