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來修飾