"字符数组与字符指针是C语言中处理字符串的两种常见方式,它们在使用上有着显著的区别。字符数组本质上是一个字符类型的数组,而字符指针则是一个指向字符的指针。字符数组在声明时通常会被初始化为一个字符串,如`char sa[] = "This is a string";`,而字符指针也可以指向相同的字符串,如`char *sp = "This is a string";`。对字符数组的操作,如果想要改变其所代表的字符串,只能修改数组内的元素。然而,对于字符指针,我们通常会改变指针本身的值,让它指向新的字符串。这种操作不会改变原始字符串的内容,只是改变了指针的指向。
C语言指针是编程中的重要概念,它涉及到变量、内存地址以及如何通过指针访问和修改内存内容。指针变量定义后需要初始化,通常赋值为某个变量的地址。指针可以进行基本的算术运算,如加减,以便访问数组或结构体的其他部分。通过指针,我们可以间接操作存储在特定内存地址的变量,如`*addr`用来访问`addr`所指向的变量的值。
在函数参数传递中,指针可以作为参数类型,允许函数修改实参的值,这是值传递无法实现的。指针还可以用于实现函数返回多个值,通过传递指针,函数可以修改指针所指向的数据。动态内存分配是通过指针实现的,如`malloc()`和`calloc()`函数,它们允许程序在运行时根据需要分配和释放内存。
在《Chap8指针》这一章中,通过一个特工008寻找保险箱密码的故事,讲解了如何使用指针来查找和访问内存中的数据。密码被比喻为存储在不同寄存箱中的内容,寄存箱的地址则相当于内存地址。如果知道寄存箱的名字(变量名),可以直接找到密码;若只知道地址,也能通过地址找到密码;甚至如果只有存放地址的地址,可以通过一层层的指针寻址间接获取密码。例如,代码示例展示了如何通过指针变量`addr`来访问和输出变量`key`中的密码值。
在C语言中,`int *addr = NULL;`定义了一个整型指针`addr`,并将其初始化为NULL。随后,`addr = &key;`将`key`的地址赋给`addr`,使得`addr`可以间接访问`key`的值。通过`*addr`,我们可以在不知道变量名的情况下,只凭地址获取变量的值,这体现了指针的间接访问能力。"