关于c语言指针的两处小tip分享
1:常量指针与指针常量
常量指针与指针常量名字很接近,但是两者区别很大。
常量指针是指指向常量的指针,例如:char const *st[4]="str";或者使用下面的方法,效果是一样的:const char *st[4]="str"; 它声明了一个指针变量,这个指针指向了一个常量字符串,但是由于指向的内存空间是常量,因此该地址的内容是不能修改的,例如:*st="no"; //这是不行的,因为内存空间的内容不能修改st="ok"; //这是可以的,虽然指向的内存内容不能修改,但是指针的指向是可以修改的。
指针常量是指一个指向固定内存单元的指针,其内容可以修改,但是不能改变指向的位置,例如:char *const st[4]="str";*st="ok"; //这是可以的,因为指向位置的内容可以修改。st="no"; //这样行不通,因为指针是不能改变指向位置,即如果初始化为地址0X8000,那么它只能指向这个位置,不能改变,但是0X8000的内容是可以改变的。
char *s = "abcde";
s[0] = '1';//此句在运行时出错
如下是可以的:
char s[] = "abcde";
s[0] = '1';
因为:
字符串常量是不能改的,编译后是放到只读内存(静态存储区)中的;
char[]和char*在很多地方可以通用,但是有个微妙的关系,那就是头指针相同;
因为“通过指针修改字符串常量的行为”是未定义的,上次就有个人问"为什么上述代码在TC下不报错而在VC6.0下报错"。不过,现在大多实现把常量字符串的存储空间设置为read-only,所以运行时报错;
char *s = "abcde";相当于const char *s = "abcde";
-------------------------------------------
按照楼上各位的说法,编译器应该禁止这么声明:
char *s = "abcde";
而强制我们如下声明:
const char *s = "abcde";
为什么编译器没有这么做呢?
--------------------------------------------
没错,的确因该像楼主说的那样,编译器应该禁止这种行为,进而帮助程序员写出正确的程序。
但是,这是一个特殊情况,是一个特例!
为什么这么说呢?因为char *s = "abcde";这种模式已经被很多人所使用(也包括楼主),它被使用的如此广泛以至于标准给它一些宽容:允许这样的代码通过编译。
-------------------------------------------- 《effective c++》91页注释1:
在C++ standard中,"Hello"的型别是const char[];这个型别几乎总是被视为const char*。因此我们预期,以一个字符串子面常量(string literal,例如"hello")作为一个char*变量的初值,会违反常量性。但是此种行为在C语言中实在太过频繁,所以C++ standard对于这样的初始化动作特别给与豁免。尽管如此,你还是应该避免这么做,因为那毕竟不被大家认同。
相关推荐
-
举例理解C语言二维数组的指针指向问题
之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]
-
讲解C语言编程中指针赋值的入门实例
从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无
-
基于C语言中野指针的深入解析
"野指针"的成因主要有两种:(1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存.例如 复制代码 代码如下: char *p = NULL; char *str = (char *) malloc(100); (2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针.参见7.5节.别看free和dele
-
C语言中下标与指针的转换以及指向指针的指针的例子
下标到指针之间和转换 以下的程序做了什么. #include <stdio.h> int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int i = 0; int j = 0; for(i = 0; i<3; i++) { for(j=0; j<3; j++) { printf("%d\n", *(*(a+i)+j)); } } } 打印了数组中的每个元素: 指向指针的指针 #include
-
C语言之free函数以及野指针介绍
[FROM MSDN && 百科]原型:void free(void *ptr);#include<stdlib.h>或#include <malloc.h>Deallocate space in memory释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc.realloc以及realloc函数来再分配.注意:连续两次使用free函数,肯定会发生错误.malloc的次数要和free的次数相等.A block of memory
-
C语言指针入门学习面面观
这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,
-
Swift与C语言指针结合使用实例
Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作. ####用以输入/输出的参数指针 C和Objective-C并不支持多返回值,所以Cocoa API中常常将指针作为一种在方法间传递额外数据的方式.Swift允许指针被当作inout参数使用,所以你可以用符号&将对一个变量的引用作为指
-
简单分析C语言中指针数组与数组指针的区别
首先来分别看一下,指针数组的一个小例子: #include <stdio.h> #include <string.h> int lookup_keyword(const char*key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if (strcmp(key, table[i]) == 0) { ret = i; break; } } ret
-
c语言:基于函数指针的两个示例分析
第一个:------------------------------------------------------ 复制代码 代码如下: #include <stdio.h>#include <string.h>void tell_me(int f(const char *, const char *));int main(void){ tell_me(strcmp); tell_me(main); return 0;}void tell_me(int f(const
-
关于c语言指针的两处小tip分享
1:常量指针与指针常量 常量指针与指针常量名字很接近,但是两者区别很大. 常量指针是指指向常量的指针,例如:char const *st[4]="str";或者使用下面的方法,效果是一样的:const char *st[4]="str"; 它声明了一个指针变量,这个指针指向了一个常量字符串,但是由于指向的内存空间是常量,因此该地址的内容是不能修改的,例如:*st="no"; //这是不行的,因为内存空间的内容不能修改st="ok&quo
-
关于C++中vector的两个小tips分享
前言 本来这篇文章标题我想起成<关于 vector 的两个小坑>,后来想想,其实也不算是坑,还是自己对原理性的东西理解的没做那么透彻.工作中遇到的很多问题,后来归根到底都是基础不牢靠. vector 扩容 这个问题很经典了,但还是不小心踩到.有一个需求是要对目标元素进行复制,而目标元素集合是保存在 vector 里面,于是简单思考下就有如下代码(大致含义): void Duplidate(vector<Element>* element_list, Element* element
-
赌你会懵的C语言指针进阶数组场景解析
目录 正片开始 一维数组 字符数组 二维数组 整点硬菜 正片开始 细化指针这一部分内容,现在着重把一些指针的运用情景搬出来康康,如果对指针盘的不是非常熟练,或者指针还出于入门阶段的铁子请绕道(晕头警告) 直接给大家盘个套餐: 一维数组 int a[] = {1,2,3,4,5}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a+0)); printf("%d\n",sizeof(*a)); pri
-
C语言指针和数组深入探究使用方法
目录 1.数组参数和指针参数 1.1 一维数组传参 1.2 一级指针传参 1.3 二维数组参数和二级指针参数 1.4 野指针的问题 2.函数指针 3.函数指针数组 4.指向函数数组的指针 5.回调函数 6.一道笔试题 1.数组参数和指针参数 1.1 一维数组传参 这里在前几期我们已经初略的见识过了,但是这里我们要提一个概念,数组给函数传参是会发生降维的,降维成什么呢?我们看代码: 这里通过打印形参的大小,发现是 4,其实也不奇怪,目前我们是 32 位操作环境,所以一个指针也就是 4 个字节,所以
-
C语言指针详解及用法示例
新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法
-
深入理解C语言指针及占据内存空间
原文链接:https://www.cnblogs.com/l-hh/p/12288613.html 第一.了解内存空间 本文章文字有点多,会有点枯燥,配合图文一起看可以缓解枯燥,耐心阅读哦!!! 先了解内存地址,才更好的理解指针! 我们可以把内存想象为成一列很长很长的货运火车,有很多大小相同的车厢,而每个车厢正好相当于在内存中表示一个字节.这些车厢装着不同的货物,就像我们的内存要存着各式各样的数据. 多啰嗦一下 我们平时在电脑上能够听音乐.看视频和文章,其实看到的这些东西就是内存中每个"车厢&q
-
C语言指针基础知识实例讲解
对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到,内存区每一个字节都有一个编号,地址也可以形象的理解成我们生活中的住址,通过住址找到每一个人所在的地方.指针作为一个变量用来存放地址,可以通过指针来改动变量. 上图就是一个简单的定义一个一级指针变量和利用指针改变变量数值的过程.int*表示整型指针,*p表示解引用操作,就是利用指针找到a的地址然后再改
-
C语言指针详解
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所
-
C语言指针必备基础全面覆盖
目录 前言 一.指针是什么? 1.数据在内存中的存储 2.一个小的单元到底是多大? 二.指针变量 1.什么是指针变量 2.指针类型 3.指针类型的作用 三.野指针 1.什么是野指针 2.野指针成因 2.1. 指针未初始化 2.2指针越界访问 2.3指针指向的空间释放 3.如何规避野指针 四.指针运算 1.指针±整数 2.指针-指针 五.指针和数组 1.数组元素的指针 2.通过指针引用数组元素 六.二级指针 七.指针数组 最后 前言 指针是C语言中的一个重要概念.正确而灵活的运用指针,可以使程序间
-
C语言 指针数组进阶详解
目录 指针与数组中的sizeof与strlen sizeof strlen 数组名 1.一维数组 整型数组 字符数组 指针数组 2.二维数组 指针笔试题 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽.接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作
随机推荐
- Angular 4依赖注入学习教程之ValueProvider的使用(七)
- 纯js写的分页表格数据为json串
- 基于Java的打包jar、war、ear包的作用与区别详解
- java中Scanner类的简单用法分享
- bootstrap多层模态框滚动条消失的问题
- MySQL的主从复制步骤详解及常见错误解决方法
- mysql下普通用户备份数据库时无lock tables权限的解决方法
- 如何利用php array_multisort函数 对数据库结果进行复杂排序
- JS根据生日月份和日期计算星座的简单实现方法
- 解决JSP开发中Web程序显示中文三种方法
- Win2008中安装的MSSQL2005后无法访问的解决方法
- 关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
- 个人经验总结:网站被百度“拔毛”如何恢复?
- rsync 数据同步使用详解
- 简单介绍Python的Django框架加载模版的方式
- vue3.0 CLI - 3.2 路由的初级使用教程
- Spring Boot 文件上传与下载的示例代码
- spring cloud 阿波罗 apollo 本地开发环境搭建过程
- 详解Linux搭建DNS服务器
- 简单学习5种处理Vue.js异常的方法