博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言基础---12.const使用(数组指针、指针常量,常量指针、常量指针常量、常量数组)
阅读量:2393 次
发布时间:2019-05-10

本文共 2618 字,大约阅读时间需要 8 分钟。

文章目录

1、普通数组指针

#include 
int main() {
char data = 'a'; char* p = &data; printf("%c \n", *p); printf("===============\n"); char dd = 'd'; p = ⅆ // 指针可以指向其他内存地址 printf("%c \n", *p); printf("===============\n"); *p = 'e'; // 可以通过指针内存的值 printf("%c \n", dd);}
a===============d===============e

2、char* const p (指针常量)

重点:const修饰什么,什么就不能被改变!!!

  • char * const p 中,const修饰的是p,所以p(指针指向的内存地址)不能改变,也就是指针常量,不能指向其他的地址了!
  • 但是,指针指向的值(内存保存的值)可以改变
#include 
int main() {
char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); char* const p = &data; printf("%p \n", p); //p = &buf; //error:assignment of read-only variable‘p’ *p = 'A'; printf("==============\n"); printf("%p \n", p); printf("%c \n", *p);}
00CFFE43			// data 变量的地址==============00CFFE43			// 指针p指向data之后,指针p的地址==============00CFFE43			// 指针解引用*p,修改某地址中的值之后,指针p的内存地址还是没变A
  • 指针常量-----char* const p ,const修饰指针p,说明p不能指向其他地址了!
  • 通过*p = 'A’可以改变了这个内存地址的值,p的指向还是之前的地址

3、const char* p (常量指针)

重点:const修饰什么,什么就不能被改变!!!

  • const 修饰的是 *p, 而*p代表解引用,代表是的某个内存地址保存的值,所以*p = xx直接赋值肯定不行的!
  • const没有修饰p,所以指针的地址( p )可以改变,即指针的指向可以改变,最终*p也就改变了!
#include 
int main() {
char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); const char* p = &data; printf("%c \n", *p); printf("%p \n", p); printf("==============\n"); // *p = 'A'; // const修饰*p,所以不能通过解引用修改指针指向的值 p = &buf; // 但是,可以改变指针的指向 printf("%p \n", p); printf("%c \n", *p);}
010FFAB7			// 打印变量data的地址值==============a					// 指针*p对应的字符的值010FFAB7			// 指针p对应的地址的值,指针p指向了data的地址==============010FFAAB			// 改变指针的指向之后,指针对应的地址值b					// 指针p的指向变了,所以最终的解引用的值也变了!
  • 常量指针,const char* p,const修饰的是*p,说明这个指针指向的值*p不能改变。
  • 虽然*p不能修改,但p可以修改,即p可以指向另一个内存空间,最终*p的值变化了。
  • 注意:虽然*p的值在如上过程变化了,但是是通过改变p的指向,间接改变了*p的值,而不是直接使用*p=‘m’这种方式改了*p的值!!!

4、const char * const p (常量指针常量)

使用const修饰*p & p, 双重修饰

  • 不能通过p改变指针指向
  • 也不能通过*p改变指针指向地址的值
#include 
void main() {
char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); const char * const p = &data; *p = 'A'; // 不能通过解引用方式,修改内存地址的值 p = &buf; // 也不能,修改指针的指向地址}

5、const修饰数组

#include 
int main() {
// const char array[5] = { 'a', 'b', 'c' }; // const char, char const 是等价 char const array[5] = {
'a', 'b', 'c' }; char* p = &array; *(p + 1) = 'e'; //array[2] = 'd'; //左值指定const对象,表达式必须是可修改的左值 printf("%s \n", array);}
aec
  • const 修饰的数组,不能通过数组直接修改数组中的参数
  • 但是,如果指针指向了数组,可以通过指针指向的地址,通过改变内存地址的值,改变数组中元素的值!

代码中*(p + 1) ='e’解释

  • 指针p指向了数组array,而指针指向的地址是数组的首元素地址,则&p代表的是首元素的地址,p+1代表的是第二个元素的地址,所以*(p+1)代表对第二个元素解引用,改变第二个元素内存地址的值。
  • 如果还不是很清楚,可以参考详解:

转载地址:http://cveab.baihongyu.com/

你可能感兴趣的文章
Cpanel PHP Restriction Bypass Vulnerability 0day
查看>>
一例千万级pv高性能高并发网站架构
查看>>
CVE-2011-4107 PoC - phpMyAdmin Local File Inclusion via XXE injection
查看>>
tomcat RequestDispatcher directory traversal vulnerability
查看>>
canvas and core impact中国购买地址
查看>>
mysql+php搜索型注入问题记录
查看>>
ajax跨域和js跨域解决方案 .
查看>>
如何用Squid来实现Ajax跨域代理
查看>>
APEX的安装
查看>>
Metasploit和armitage整合教程
查看>>
使用安全json parser防止json注入
查看>>
所有从非官方网站下载的putty和WinSCP都有后门(附清理方式)
查看>>
PHP 5.2.12 / 5.3.1 safe_mode / open_basedir Bypass
查看>>
Metasploit攻击Oracle的环境搭建
查看>>
信息安全合规性产品
查看>>
google-gruyere web2.0漏洞学习平台 =w=~
查看>>
Preventing Cross-site Scripting Attacks
查看>>
WASC Distributed Web Honeypots Project Update
查看>>
安装pydev到eclipse
查看>>
[WAF]apache和modsecurity的安装
查看>>