(1) 对函数返回的限定;
(2) 对函数参数的限定。
#include <stdio.h>
void main(void)
{
const char *str= "Welcome to Fishc.com!\n\n";
// 这个语句的含义是:声明一个名为str的指针变量,
// 它指向一个字符型常量,初始化str为指向字符串
// "Welcome to Fishc.com!\n\n"
printf("\n\n%s", str);
#if (1)
str[0] = 'w'; //这条语句是错误的,但可以改变str指针的值
#endif
str = "I love Fishc.com!\n\n"; //合法!
printf("\n\n%s", str);
}
#include <stdio.h>
void main(void)
{
char * const str = "Welcome to Fishc.com!\n\n";
// 指针常量是一个固定的指针,不可以改变它的值,但它所指的数据可以改变。
str[0] = 'w'; //合法!
#if( 1 )
str = "I love Fishc.com!\n\n"; //非法!!
#endif
printf("\n\n%s", str);
}
#include <stdio.h>
void main(void)
{
const char * const str = "Welcome to Fishc.com!\n\n";
// 常量指针是一个固定的指针,不可以改变它的值,但它所指的数据可以改变。
str[0] = 'w'; //非法!
str = "I love Fishc.com!\n\n"; //非法!!
printf("\n\n%s", str);
}
int b = 10;
int c = 15;
const int* pl = &b;
//*p1=12; 报错,以为常量指针只能修改指针即地址
//不能修改变量值!
p1 = *c;/*正确*/
int* const p2 = &b;
*p2 = c;/*正确*/
//p2=&c;/*错误*/
/*const右侧靠近指针还是常量,是指针就是常量指针,是常量就是指针常量*/
/*或者可以将const理解为“常量”,从左向右读,const右侧是指针不能改常量值,右侧是数据类型不能改地址*/
/*const右侧靠近指针还是常量,是指针就是常量指针,是常量就是指针常量*/
/*或者可以将const理解为“常量”,从左向右读,const右侧是指针不能改常量值,
1.指向常量的指针 常量指针
例;
const int *pointer; // 指向的值不能改变 地址可以变pointer=&a
const修饰的是int型常量,该常量数值不能修改,类似于const int i=0;i不可以更换数据,const右侧为数据类型即修饰的是常量,常量值不能修改,
2.指针类型的常量 指针常量
例:
int *const pointer; // 指针本身的值不能改变 变量的值可以改变*pointer=20;
右侧是数据类型不能改地址*/
const修饰的是指针,该指针不能修改即地址不能变化。const右侧为指针变量,即指针不可变,即地址不可变
指针常量、常量指针不可变的加深记忆为:叫法左侧的不可改变。
memcpy函数的用法
描述
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
声明
下面是 memcpy() 函数的声明。
void *memcpy(void *str1, const void *str2, size_t n)
参数
- str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
- n -- 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
实例
// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>
int main ()
{
const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);
printf("dest = %s\n", dest);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
dest = http://www.runoob.com
将 s 中第 11 个字符开始的 6个连续字符复制到 d 中:
#include <stdio.h>
#include<string.h>
int main()
{
char *s="http://www.runoob.com";
char d[20];
memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
// 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
d[6]='\0';
printf("%s", d);
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果:
runoob
覆盖原有部分数据:
#include<stdio.h>
#include<string.h>
int main(void)
{
char src[] = "***";
char dest[] = "abcdefg";
printf("使用 memcpy 前: %s\n", dest);
memcpy(dest, src, strlen(src));
printf("使用 memcpy 后: %s\n", dest);
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果:
使用 memcpy 前: abcdefg 使用 memcpy 后: ***defg