详解C语言中的常量指针和指针常量
常量指针
常量指针是指一个指针指向的内存地址不能被修改,但是它指向的内存地址所存储的值可以被修改。可以通过 const 关键字来指示这个指针是常量,例如:
int a = 10;
const int *p = &a;
上面的代码中,p 是一个常量指针,它指向一个整型数 a,但是不能通过 p 修改 a 的值,例如:
*p = 20; // Error: 不能修改 *p 所指向的内存地址的值
但是可以通过其他的途径来修改 a 的值,例如:
a = 20; // Ok: 直接修改 a 的值
指针常量
指针常量是指一个指针本身不能被修改,但是它指向的内存地址所存储的值可以被修改。可以通过 const 关键字来指示这个指针是常量,例如:
int a = 10;
int *const p = &a;
上面的代码中,p 是一个指针常量,它指向一个整型数 a,但是不能通过 p 修改它所指向的内存地址,例如:
p = NULL; // Error: 不能修改 p 本身的值
但是可以通过其他的途径来修改 a 的值,例如:
*p = 20; // Ok: 直接修改 *p 所指向的内存地址的值
示例说明
示例1:使用常量指针来实现字符串的复制
#include <stdio.h>
#include <string.h>
int main()
{
char *src = "hello world";
const int len = strlen(src);
char dest[len];
const char *pSrc = src;
char *pDest = dest;
while ((*pDest++ = *pSrc++) != '\0');
printf("src=%s, dest=%s\n", src, dest);
return 0;
}
上面的代码中使用常量指针 pSrc
来指向源字符串 src
,并且将目标字符串 dest
定义为一个数组。在复制的过程中,使用 while 循环来逐个复制字符串中的字符,这里的指针是通过不停地自增来移动的。通过这种方式,我们可以避免直接修改指针的值,确保了字符串数据不被破坏。
示例2:使用指针常量来实现二分查找
#include <stdio.h>
int main()
{
int array[] = {1, 3, 5, 7, 9, 11};
const int len = sizeof(array) / sizeof(int);
int num = 5;
int *const p = array;
int low = 0, high = len - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
if (p[mid] == num) {
printf("Find %d at %d\n", num, mid);
return 0;
} else if (p[mid] < num) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("Not found\n");
return 0;
}
上面的代码中使用指针常量 p
来指向整型数组 array
,并且将二分查找的过程实现为一个 while 循环。通过不停地修改 low 和 high 的值,并计算得到 mid 的值,来实现查找的过程。虽然指针常量 p
不能被修改,但是其指向的数组元素是可以被修改的,这样我们就可以动态地修改数组的值,来实现更复杂的算法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言中的常量指针和指针常量 - Python技术站