const:把某些变量常量化
宏:只是宏名替换,编译过程中不检测语法错误。 #define PI 3.14
float pi = 3.14 //典型的类型//变量//值的用法。
const float pi = 3.14 //使pi一直保持为常量
指针常量/常量指针
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
const float pi = 3.14;
printf("%f\n",pi);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
3.140000
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
const float pi = 3.14; //定义pi为只读变量,约定这一个空间不可变,变量常量化
pi = 3.14159; // 如果在const常量后继续给pi赋值,则编译报错,提示cost常量pi为只读变量
printf("%f\n",pi);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
const.c: In function ‘main’:
const.c:9:5: error: assignment of read-only variable ‘pi’
pi = 3.14159;
^
<builtin>: recipe for target 'const' failed
make: *** [const] Error 1
const float pi = 3.14; // const修饰了pi,不能通过pi改变取值,但可以通过修改指针(指向),间接对pi的值改变
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
const float pi = 3.14;
float *p = π
*p = 3.14159;
printf("%f\n",pi);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
const.c: In function ‘main’:
const.c:9:13: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
float *p = π
^
book@100ask:~/C_coding/CH01$ ./const
3.141590
可以执行,但不建议,编译警告,在很多时候就已经是当作error看待。要调到没有警告为止。
上例只是说明,const修饰的常规变量,其值也可以发生改变,并不是完全不变的。
const int *p; 常量指针
int const *p: 常量指针 //指针p的指向可以变,但指针指向的目标变量不可变。
int *const p: 指针常量 //指针p的值不能变,即指针的指向不能变
*p:目标变量的值; const int *p // const后面跟一个目标,是保证目标的值不能变
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
const int *p = &i;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
1
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
const int *p = &i;
i = 10;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
10
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
const int *p = &i;
*p = 10;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
const.c: In function ‘main’:
const.c:10:5: error: assignment of read-only location ‘*p’
*p = 10;
^
<builtin>: recipe for target 'const' failed
make: *** [const] Error 1
const int *p = &i; // 常量指针,指针的指向固定为i的地址,即指针p的值*p不可用改变,但i的赋值可以改变。//i之前没有const修饰。cost修饰*p,不可通过*p去修改i的取值
const锁定某个空间不能变化,只是锁定名字不能变化,而不是整个空间不能变化。
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
int j = 100;
const int *p = &i;
p = &j; //only define, can not be updated using *p, but can be updated using p
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
100
常量指针(const int *p = &i;):指针的指向可以变化,但指针指向的目标值不可变化;
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
int * const p = &i;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
1
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
int * const p = &i; //const后面跟的是p,表示p的指向不能改变,但p的值*p可以改变
*p = 10;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
10
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
int j = 100;
int * const p = &i;
p = &j; //指针常量:意味着指针的指向不可改变,但指针所指向的值可以发生变化
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
const.c: In function ‘main’:
const.c:11:4: error: assignment of read-only variable ‘p’
p = &j;
^
<builtin>: recipe for target 'const' failed
make: *** [const] Error 1
指针常量(int * const p = &i;):指针的指向不可变化,但指针指向的目标值可变化
book@100ask:~/C_coding/CH01$ cat const.c
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
int i = 1;
int j = 100;
const int * const p = &i;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make const
cc const.c -o const
book@100ask:~/C_coding/CH01$ ./const
1
指针常量(const int * const p = &i;;):指针的指向不可变化,但指针指向的目标值也不可变化
STRCPY(3) Linux Programmer's Manual STRCPY(3)
NAME
strcpy, strncpy - copy a string
SYNOPSIS
#include <string.h>
char *strcpy(char *dest, const char *src); //用const修饰被copy的源数据类型[const char *src],表示该部分内容不会发送改变。 目标*dest没有被修饰[char *dest],表示目标可变,否则元数据就无法被copy到目标
char *strncpy(char *dest, const char *src, size_t n);
函数封装接口时常用const,哪一部分不希望被改变,就用const来修饰