C語言基礎 -38 指針_const與指針

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 = &pi;
	
	*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 = &pi;
             ^
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來修飾 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章