C指针解析 ------ 指针的算术运算

本文是自己学习所做笔记。欢迎转载。但请注明出处:http://blog.csdn.net/jesson20121020

指针是一个特殊的变量,表示一个地址,而地址能够上减去或加上一个整数,从而能够表示新的地址.

以下通过一段代码来分析指针的算术运算:

#include <stdio.h>
int main(){
	int i;
	char str[]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};
	int *p = str;
	char *q = str;
	q++;
	p++;
	printf("数组str的首地址:%x\n",str);
	printf("指针q指向的内在区:%x\n",q);
	printf("指针p指向的内存区:%x\n",p);
	printf("数组的第一个元素的值:%c\n",*str);
	printf("数组的第一个元素的值:%c\n",*p);
	//遍历数组第一种方法,下标法
	printf("遍历数组第一种方法,下标法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",str[i]);

	//遍历数组另外一种方法,数组名指针法
	printf("\n遍历数组另外一种方法,数组名指针法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",*(str+i));	

	//遍历数组第三种方法,指针法
	q = str;
	printf("\n遍历数组第三种方法,指针法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",*q++);
}

运行结果:

能够看出,数组的首地址为163c4730.通过上节的指针的概念和四个要素,非常easy得知,指针q的类型为char*,且指针q指向的类型为char; char *q = str;的作用是将数组str的首地址赋给指针q,也就是说指针q的值或q指向的内存区就是数组str的首地址. 接下来,指针q自加1,这时,编译器是这样处理的,它把指针q的值加上了sizeof(char),也就是在原来的地址的基础上向后移动了一个字节,即指针q的指向的内存区为163c4730+1=163c4731.
同理,指针p的类型为int*,且指向的类型为int,  int *p = str; 作用也是将数组的首地址赋给指针p,p++,编译器将把指针p的值加上了sizeof(int),也就是在原来的基础上向后移动了4个字节,即指针p指向的内存区为163c4734,所以指针p在自加前,是指向数组第0号单元開始的四个字节。在自加1后指向了数组第四号单元開始的四个字节。

因此,推断指针向后移动的多少位时,须要推断指针指向的类型。

也能够用指针来遍历数组,如上述代码,能够使用数组名,由于这里的数组名就是指向了数组的第0号单元,假设在此基础上加上一个偏移量,就能够訪问数组的其它元素。因此。能够用数组名+偏移量来遍历数组。同理,另设一个指针指向数组的第0号单元,每次指针自加1。就能够遍历整个数组,这里要注意,指针的所指向的类型。要和数组的元素类型要一致,所以上述代码中用指针q来遍历数组,而不是用指针p来遍历。

当然,假设指针减去一个整数,处理过程和加上一个过程类似。仅仅是向前移动了。而不是向后移动。

总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew。ptrnew的类型和ptrold的类型同样,ptrnew所指向的类型和ptrold所指向的类型也同样。

ptrnew的值将比ptrold的值添加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew。ptrnew的类型和ptrold的类型同样,ptrnew所指向的类型和ptrold所指向的类型也同样。

ptrnew的值将比ptrold的值降低了n乘sizeof(ptrold所指向的类型)个字节。就是说。ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

时间: 2024-12-20 00:44:52

C指针解析 ------ 指针的算术运算的相关文章

C指针解析 ------ 指针表达式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式,其结果是一个指针. 例1. int  a,b; int array[20]; int *p; p = &a;             //&a 就是一个指针表达式,因为&a的结果就是一个指针. int **q = &p;     //&p也是一个指针表达式. *q = &b;            //*p和

C指针解析 ------ 指针的概念及要素

 本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 指针在C语言中的地位,不用多说. 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存中的一个地址.指针有四个要素,分别是指针的类型,指针所指向的类型,指针的值或者指针所指向的内存区,还有指针本身所占据的内存区.所以要理解指针,就必须要搞清楚这四个要素.下面分别来说. 先来看一个例子,通过例子来直观的看指针这四个要素到底代表什么: 例1. (1) int *ptr

右左法则----复杂指针解析

核心提示:因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既着名又常用的方法 因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既着名又常用的方法.不过,右左法 则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法.C标准的声明规则,是用来解决如何创建声明的,而右左法则是用 来解决如何辩识一个声明的,两者可以说是相反的.右左法则的英文原文是这样说的: The right-left rule:

指针理解——复杂指针解析

右左法则 首先从最里面的圆括号看起,然后往右看,再往左看,每当遇到圆括号时,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完毕. 举例:int * (* (*fun) (int *)) [10] 首先,fun是一个指针,因为他先跟*(绿色色)结合.fun指向的是一个函数,该函数特点是有一个整形指针做参数,并且返回值仍然是一个指针(品红色).其返回值指针指向的内容是个数组.所指向的数组有10个元素,每个元素都是int *类型. 练习: 用变量a给出下

解析 指针数组,数组指针,函数指针

一 :关于指针和堆的内存分配 指针数组 : 一个数组里放的都是指针,我们把他叫做指针数组 int * a[10]; 由于它是一个数组,他是不能从堆空间里申请空间的. 只能做个循环,每个元素去申请空间,或者每个元素去指向另外的地址空间. 数组指针 : 一个指向一唯或者多唯数组的指针: int * b=new int[10]; 指向一唯数组的指针b ; 一些例子: int (*b2)[10]=new int[10][10]; 注意,这里的b2指向了一个二唯int型数组的首地址. 注意,这里的b2的类

C指针解析 ------ 运算符&amp;和*

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 & 是取地址运算符,* 叫做指针运算符或间接运算符.&a 的运算结果是一个指针,指针的类型是a的类型加上*,指针所指向的类型是a的类型,指针的值也就是指针所指向的内存区就是a的地址. *p的运算结果就多了,总之,*p的结果是p所指向的东西,这个东西有这些特点: 它的类型是p所指向的类型,它所占用的地址是p所指向的地址. 看下面的例子: int a = 5; int b;

【转】让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: [cpp] view plain copy int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________

指针与指针变量

一.指针与指针地址 1. 地址 计算机的内存被划分成一个个存储单元,这些存储单元按一定的规则编号,这个编号就是存储单元的地址.每个存储单元大小为一个字节,每个单元的地址是唯一的. 2. 变量的地址 在程序中所有的变量都要分配相应的存储单元,不同数据类型所需要的存储空间的大小不同.系统分配给变量的内存空间的起始单元单元地址称为该变量的地址. 例如: int a; 假设分配给a的4个存储单元编号为0x300.0x301.0x302.0x303,如图,则0x303称为变量a的地址. 3. 指针 变量在