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的指向可以变,但指针指向的目标变量不可变。

扫描二维码关注公众号,回复: 11375744 查看本文章

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来修饰 

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/106888564