C语言指针的算术运算
2015-08-16 06:35
477 查看
当C语言中的指针执行数组元素时,C语言允许对指针进行算术运算。
指针
指针
两个指针相减,得到的是指针之间元素的个数。若指针
指针的比较依赖于指针所指向的两个元素的相对位置。若指针
因此适用于指针运算的运算符包括算术运算符
C语言的间接寻址运算符
函数中数组形式的形式参数传入的都是指针,为了明确指针形式,可以将数组型形式参数该为指针,两者是完全一样的。
同样,指针也可以作为数组名一样使用,指针
多维数组的元素在内存中是依序存储的,获得第一个元素的指针,就可以通过重复自增指针的方式访问到每一个元素。
C语言中
https://www.coursera.org/course/pkuic
指针运算
C语言支持3种格式的指针算术运算,包括指针加上整数,指针减去整数和两个指针相减。同时还可以用关系运算符进行指针比较。指针
p加上整数
j表示指针向后移动
j个单位(每个单位大小为指针
p的类型所占的字节数),指向
p原先指向的元素后的第
j个元素。若
p指向数组
a[i],则
p+j指向
a[i+j]。
指针
p减去整数
j表示指针向前移动
j个单位,指向
p原先指向的元素前的第
j个元素。若
p指向数组
a[i],则
p-j指向
a[i-j]。
两个指针相减,得到的是指针之间元素的个数。若指针
p指向
a[i],指针
q指向
a[j],则
p-q等于
i-j。
指针的比较依赖于指针所指向的两个元素的相对位置。若指针
p指向
a[i],指针
q指向
a[j],
p和
q的比较结果由
i与
j的大小决定。
因此适用于指针运算的运算符包括算术运算符
+、
-,赋值运算符和复合赋值运算符(
=,
+=,’-=’,
++,
--)和所有的关系运算符。
/************************************** * pointer_5.c * * * * C语言中的指针运算 * **************************************/ #include <stdio.h> #define N 10 int main() { int a , sum, *p; int i = 0; printf("请输入%d个整数:", N); for (;i < N; i++) { scanf("%d", a + i); } p = a; sum = 0; for (i = 0; i < N; i++) { sum += *p; p++; } printf("这%d个数的和为%d\n", N, sum); return 0; }
C语言的间接寻址运算符
*常和
++或
--运算符一起使用,具有以下四种不同的形式:
表达式 | 含义 |
---|---|
*p++或*(p++) | 首先计算表达式的值为*p,然后p自增1 |
(*p)++ | 首先计算表达式的值为*p,然后*p自增1 |
*++p或*(++p) | 首先将p自增1,然后计算表达式的值为*p |
++*p或++(*p) | 首先将(*p)自增1,然后计算表达式的值为(*p) |
/************************************** * pointer_6.c * * * * C语言中的自增自减和间接寻址运算符 * **************************************/ #include <stdio.h> #define N 10 int main() { int a[10] = {0,1,2,3,4,5,6,7,8,9}; int temp = 0; int *p = a; printf("p的初始值为%p, *p值为%d\n", p, *p); temp = *p++; printf("*p++的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = *(p++); printf("*(p++)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = (*p)++; printf("(*p)++的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = *++p; printf("*++p的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = *(++p); printf("*(++p)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = ++*p; printf("++*p的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); printf("p的初始值为%p, *p值为%d\n", p, *p); temp = ++(*p); printf("++(*p)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p); return 0; }
指针和数组
可以用数组的名字作为指向数组第一个元素的指针。但数组名是指针常量,不能赋值。函数中数组形式的形式参数传入的都是指针,为了明确指针形式,可以将数组型形式参数该为指针,两者是完全一样的。
同样,指针也可以作为数组名一样使用,指针
p的表达式
p[i]等价于
*(p+i)。
多维数组的元素在内存中是依序存储的,获得第一个元素的指针,就可以通过重复自增指针的方式访问到每一个元素。
C语言中
n维数组是被当成一个一维数组,每个数组元素是一个
n-1维数组,依次类推。因此对于数组
int a[N1][N2]...[Nm]来说,
a是一个一维数组的指针,其元素是一个
n维数组,因此
a指针增减的移动单位是
n维数组,
a[N1]是一个一维数组的指针,其元素是一个
n-1维数组,因此
a[N1]指针增减的移动单位是
n-1维数组,依次类推,
a[N1][N2]...[Nm-1]是一个一维数组的指针,其指针增加的移动单位是一个
int型长度,指针指向的是
int型的数组元素。
/************************************** * pointer7.c * * * * C语言中指针和数组 * **************************************/ #include <stdio.h> #define N 10 void ReversePrint(int a[]) { int *p = a + N - 1; for (; p >= a; p--) printf("%d ", *p); } int Sum(int *a) { int *p = a; int sum = 0; for(; p < a + N; p++) sum += *p; return sum; } int main() { int a ; printf("请输入%d个整数", N); int i = 0; for (; i < N; i++) scanf("%d", &a[i]); printf("10个数的反序排列为:"); ReversePrint(a); printf("\n"); printf("这%d个整数的和为%d\n", N, Sum(a)); return 0; }
参考文献
K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社https://www.coursera.org/course/pkuic
相关文章推荐
- C++ Windows对象和MFC对象的区别
- [C语言][LeetCode][26]Remove Duplicates from Sorted Array
- [C语言][LeetCode][228]Summary Ranges
- 使用线性同余法生成伪随机数/序列(C++实现)
- c语言中scanf输入带空格的字符串以及scanf输入单个字符的问题
- poj1035 spell checker (简单的字符串查找题)
- Log4cpp:为中小型C++项目加上log支持
- iOS基础班之c语言学习复习查漏
- C++对象模型——对象的构造和解构(第六章)
- C语言/C++ 实现汉诺塔代码
- C++写数据到文件
- c++ public, protected, private成员变量,成员函数继承和访问规则实例代码
- C++对象模型——执行期语意学(第六章)
- C++中public,protected,private访问小结
- C语言 memcpy二维数组的复制
- 关于c++析构函数
- C语言-5
- C语言-4
- C语言-3
- c语言-2