关于C语言指针几个容易混淆的概念
前言:
大多数学习过C/C++或者正在学习的同学在对指针概念把握时,总是感觉不太明了,小弟我也不例外啊,于是翻开资料复习整理一下,并把自己的学习心得拿出来供大家分享,讨论。 基本概念掠过,主要来探讨一下容易混淆的几个概念。
1.指向常量的指针与指针常量
a.指向常量的指针
如const char * pStr是指向常量的指针变量,既此定义的变量是一个指向字符数组的指针变量,我们可以对其进行再次赋值,但该指针指向的地址块的值不能改变。请看 下面的例子:
char ch[5]="lisi“;
const char * pStr=ch; //pStr 是指向字符数组的指针变量
pStr="wangwu"; //这是没有任何问题的
*pStr="w"; //此处编译时会报错,因为我们通过指向*符找到pStr所指向的内存地址块是常量所占有,所以不能再次赋值。
指向常量的指针主要用于作为函数的参数,如定义一个画线函数:
void DrawLine(const CPoint *pt1,const CPoint * pt2){
// .....
}
通过参数pt1, pt2获得两个点的指针,在函数体中我们可以获取pt1->x,pt1->y,但是我们无法进行 pt1->x=3等赋值操作,从而保证了数据的一致性与安全性。
b.指针常量
下面我们对比性地来看指针常量 如:
char * const pStr;
此处定义的是一个指针常量,有的教材上叫它常量指针,个人觉得还是叫它指针常量比较容易理解记忆既然是常量,在定义时初始化之后,就不能对其再赋值,但其指向的 地址块的值可以改变。
char ch[5]="lisi";
char * const pStr=ch;
pStr="zhangsan"; //错误
*pStr='w'; //正确
由于const char * pStr与 char * const pStr外观上太相似,所以和容易弄混,我们可以通过下面的方法来记忆,但仅供参考,方便记忆而已,没有理论根据。
首先看char * const pStr中的 const修饰的是变量名pStr,所以pStr是指针常量而const char * pStr中的const后面是(char * pStr), pStr已经被指向符 * 修饰 过,所以可以理解为const修饰的pStr所指向的地址块,该地址块为常量,所以const char * pStr是指向常量的指针变量
如果你觉得上面讲还行,那就继续看下面的吧.
2.指针数组和指向数组的指针
a.数组
先我们先来探讨一下关于数组的问题,我们先定义一个数组
char ch[4]="abc";
我们可以对其进行
*(ch+0)='e';//等价于ch[0]='e';的合法操作
但是,接下来
char ch2[4]="123";
ch=ch2; //编译时会报错
这是为什么呢?因为,数组名ch其实就是一个指向字符的指针常量,下面我们我们来做一个实验:
#include <stdio.h>
#include <malloc.h>
static void main()
{
char ch[4]="abc";
char * const pCh=(char *)malloc(4*sizeof(char)); //申请地址空间 并将说空间首地址赋给pCh
*(pCh+0)='a';
*(pCh+1)='b';
*(pCh+2)='c';
*(pCh+3)='\0';
printf("%s %s",ch,pCh);
}
如果你一眼看到char * const pCh就能说出pCh是一个指针常量的话,说明天才的你已经理解前面所讲的了,我感到万分荣幸。这个程序的结果是 :abc abc
例子中 char ch[4] 与 char * const pCh=(char *)malloc(5*sizeof(char)); 的效果是一样的,c内部处理上,个人认为应该也是一样的,所以说数组名本质就是就是一 个指针常量。
b.指针数组
很好理解 就是数组里存放的是指针 如:
char * week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}
该数组中存放的是指向字符串的指针
c.指向数组的指针
如:
int (*p)[3]; // 注意括号可不能丢了
那么p就是一个指向大小为3数组的指针变量,我们知道数组名就是指针,指向数组的指针就是一个二级指针。
int a[][3]={1,2,3,4,5,6};
我们知道a是一个二维数组,可以进行以下操作
printf("%d ",*(*(a+0)+1));
printf("%d ",*(a[0]+2));
printf("%d ",a[1][2]);
结果分别是2 3 6
这是因为二维数组名是二级指针常量,接下来我们的最后一个小实验
#include <stdio.h>
static void main()
{
int a[][3]={1,2,3,4,5,6};
int (*p)[3]=a;
printf("%d ",*(*(p+0)+1));
printf("%d ",*(p[0]+2));
printf("%d ",p[1][2]);
}
将会的到同样的结果2 3 6 。
关于C语言指针几个容易混淆的概念的更多相关文章
- c语言指针详解(转载)
转自(http://blog.csdn.net/ad_ad_ad/article/details/1522145) 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指 ...
- c语言指针具体解释
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最基本的风格之中的一个.利用指针变量能够表示各种数据结构: 能非常方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高 ...
- C语言指针【转】
一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...
- c语言指针详解 经典
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...
- C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指 ...
- c语言指针详细解释
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最基本的风格之中的一个.利用指针变量能够表示各种数据结构: 能非常方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高 ...
- C语言指针专题——指针难学的4点原因
前一篇跟大家聊了聊指针的概念,可是就算了解了指针是什么,为什么依然感觉难学?我试着从几个点切入,聊聊指针难学之处. 文末会给大家推荐几本书,有需要的朋友可以看看! 难点1. 讨厌的星号 定义指针变量p ...
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
随机推荐
- android——生成或者下载的图片在相册中找不到
今天在写程序的时候,遇到了一个问题,就是生成的图片一直都不能在相册中显示出来,而且,就连通过发送Intent过去,都找不到.通过在网上搜索,发现了一个很好的方法. Intent intent = ne ...
- java学习之i/o
基本的输入输出 这里有两种方法,其中一种被注释了,可以换着注释后测试一遍 class TestSystem { public static void main(String[] args) { /* ...
- XMAL 中x名称控件的Auttribute
1 X:Class 作用告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并,只能用于根节点,并且与之同名的类需要有Partial 例如窗口 2 X:ClassModifier 作用告诉 ...
- php基础之 ->, =>,@,&,::,%符号
=> 是数组成员访问符号 -> 是对象成员访问符号 比如: $array = array("site map"=>"map.php"); // ...
- java口算器
package dd;import javax.swing.*; import java.awt.*;import java.awt.event.*;class Main extends JFrame ...
- 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言
我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...
- java初学者必看经典
配置java环境变量: JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统(在" .ba ...
- css3投影讲解、投影
迷茫了好一段时间,今天开始整理一下自己,同时也整理下新的知识. CSS3: 从头开始做起:现在在页面中用到最多的是图片/容器投影,文字投影: 接下来就总结一个投影问题: box-shadow:阴影类型 ...
- [汇编语言]-第二章DEBUG
Debug查看CPU各种寄存器中得内容,内存的情况和在机器码级跟踪程序的运行. 1- 进入Debug xp 开始-运行 cmd 输入 debug 2- Debug功能 r 查看,改变CPU寄存器的内容 ...
- 【ecos学习1】wmware运行redboot[方法一]--脚本实现配置
背景: 远程服务器Ubuntu生成软盘镜像,通过Mac下wmware运行. 1- 环境及版本: uname -a 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 ...