一、地址
1、数据存储
- 计算机中存储数据的基本单位是字节:存储在计算机中的数据都是以字节为单位进行管理的。一个字节等于8个位。
- 计算机中表示数据的基本单位是位:表示数据时,计算机使用二进制(0和1)表示每一位数据。
2、地址
在计算机中,地址指的是存储器中每个字节的唯一标识。每个存储单元都有一个地址,就像每个房子都有一个门牌号一样。地址用于定位存储在内存中的数据。例如,如果我们要访问存储在某个特定位置的数据,我们就需要知道该数据的地址。
【问题】地址是一个几位的二进制数据?
1 2 3 4 5 6 7 8 9 10
| #include<stdio.h> int main (){ int a; char b; double c; printf("sizeof(int &) = %lu\n",sizeof(&a)); printf("sizeof(char &) = %lu\n",sizeof(&b)); printf("sizeof(double &) = %lu\n",sizeof(&c)); return 0; }
|
计算机内存地址的二进制位数取决于系统架构:
- 32位系统:地址是32位二进制数。
- 64位系统:地址是64位二进制数。
地址的二进制位数通常是32位或64位。
二、数组
在C语言中,数组是一组相同类型的数据的集合,这些数据存储在连续的内存位置中。数组可以包含基本数据类型(如 int
, float
, char
)的元素,也可以包含更复杂的类型(结构体)。数组的每个元素都可以通过数组名和索引来访问和操作。
1、数组的声明
声明数组的语法如下:
1
| type arrayName[arraySize];
|
type
:数组中元素的数据类型(如 int
, float
, char
等)。
arrayName
:数组的名称。
arraySize
:数组的大小(即数组中元素的数量),必须是一个正整数常量。
例如:
1 2 3 4 5
| #include<stdio.h> int main (){ int array[10]; return 0; }
|
2、可变长数组
在某些情况下,我们可能在编译时无法确定数组的大小,而是在运行时才知道需要多少空间。它允许在运行时确定数组的大小。可变长数组的声明与普通数组类似,但数组的大小在运行时确定,而不是编译时。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h> int main() { int n; scanf("%d", &n); int array[n]; for (int i = 0; i < n; i++) { array[i] = i * 10; } for (int i = 0; i < n; i++) { printf("%d ", array[i]); } printf("\n"); return 0; }
|
3、多维数组
多维数组中最常见的是二维数组,二维数组类似于一个矩阵,它有行和列。声明二维数组的语法如下:
1
| type arrayName[rows][columns];
|
type
:数组中元素的数据类型。
arrayName
:数组的名称。
rows
:数组的行数。
columns
:数组的列数。
例如:int b[3][4]
其实就是开辟如下图的二维矩阵。
4、字符数组
符数组的声明和初始化与其他数组类似,但常用于存储字符串时需要注意字符串的终止符 \0
(空字符)。
声明一个字符数组的语法如下:
1
| char arrayName[arraySize];
|
处理字符串的函数主要包含在头文件 string.h
中:
函数 |
说明 |
strlen(str) |
计算字符串长度,以 \0 作为结束符 |
strcmp(str1, str2) |
字符串比较 |
strcpy(dest, src) |
字符串拷贝 |
strncmp(str1, str2, n) |
安全的字符串比较,最多比较前 n 个字符 |
strncpy(str1, str2, n) |
安全的字符串拷贝,最多拷贝前 n 个字符 |
memcpy(str1, str2, n) |
内存拷贝,拷贝前 n 个字节 |
memcmp(str1, str2, n) |
内存比较,比较前 n 个字节 |
memset(str1, c, n) |
内存设置,将 str1 的前 n 个字节设置为 c |
Ⅰ、strlen
计算字符串的长度,以 \0
作为结束符。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str[] = "Hello, world!"; int length = strlen(str); printf("%d\n", length); return 0; }
|
Ⅱ、 strcmp
比较两个字符串。如果相等,返回0;如果str1大于str2,返回正值;如果str1小于str2,返回负值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "Hello"; char str2[] = "World"; int result = strcmp(str1, str2); if (result == 0) { printf("相等\n"); } else if (result < 0) { printf("str1小于str2\n"); } else { printf("str1大于str2\n"); } return 0; }
|
Ⅲ、strcpy
将源字符串拷贝到目标字符串。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char src[] = "Hello"; char dest[20]; strcpy(dest, src); printf("%s\n", dest); return 0; }
|
Ⅳ、 strncmp
安全的字符串比较,最多比较前 n
个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "Hello"; char str2[] = "Helium"; int result = strncmp(str1, str2, 3); if (result == 0) { printf("前三位相同\n"); } else { printf("前三位不同\n"); } return 0; }
|
Ⅴ、 strncpy
安全的字符串拷贝,最多拷贝前 n
个字符。
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include <string.h>
int main() { char src[] = "Hello"; char dest[10]; strncpy(dest, src, 4); dest[4] = '\0'; printf("%s\n", dest); return 0; }
|
Ⅵ、 memcpy
内存拷贝,拷贝前 n
个字节。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char src[] = "Hello, world!"; char dest[20]; memcpy(dest, src, strlen(src) + 1); printf("%s\n", dest); return 0; }
|
Ⅶ、 memcmp
内存比较,比较前 n
个字节。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "Hello"; char str2[] = "Hello, world!"; int result = memcmp(str1, str2, 5); if (result == 0) { printf("前五个字节相同\n"); } else { printf("前五个字节不同\n"); } return 0; }
|
Ⅷ、 memset
内存设置,将 str1
的前 n
个字节设置为 c
。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str[20] = "Hello, world!"; memset(str, '*', 5); printf("%s\n", str); return 0; }
|
三、指针