标签:
1)指针+整数 将向后移动sizeof(指针类型)*整数个内存单元
2)指针-整数 将向前移动sizeof(指针类型)*整数个内存单元
3)说明:编译器不会检查移动过后目的地址是否可用,如果移动失误,可能会修改本不应该修改的内存单元,因此,这种运算适宜在数组内进行,或者是动态申请的内存。
4)同类型指针相减 结果为:(指针1的值-指针2的值)/sizeof(指针类型)
#include<stdio.h> void main() { int a = 10; int *p = &a; //p+1指向的地址没有初始化,编译器不会检查移动过后目的地址是否可用 printf("%d", *(p + 1));//-858993460 int nums[10] = {12,43,65,234,324,45,76,34,86,23};//指针的减法:两者之间相邻元素的个数 printf("\n%d",&nums[9] - &nums[3]);//6 getchar(); }
#include<stdio.h> void main() { int nums[10] = {10,44,22,66,11,3,23,111,344,222}; int *p = nums; while (p++ < nums + 2) { //44 22 printf("%d\t", *p); //p最开始指向nums的首地址, //出了while后的括号之后p向后移动一个元素,指向nums[1],因此输出nums[1]的值 //接着nums+1<nums+2,出了while后的括号之后p向后移动一个元素, //指向nums[2],因此输出nums[2]的值 } //while (++p < nums + 2) //{ // //44 // printf("\n%d\t", *p); //p最开始指向nums的首地址, //执行while后的括号之后p向后移动一个元素,指向nums[1],因此输出nums[1]的值 //接着执行while后的括号之后p向后移动一个元素,而nums+2<nums+2不成立,因此结束 //} getchar(); }
对*p++、(*p)++、++*p、++(*p)的理解
#include<stdio.h> void main() { double nums[10] = {10,44,22,66,11,3,23,111,344,222}; double *p = nums; //p++是指针类型 printf("%d\n", sizeof(p++));//4 //*p++是double类型 printf("%d\n", sizeof(*p++));//8 //p起初指向nums[0],*p++先取*p的值,出了表达式p指向nums[1] printf("%f\n", *p++);//10 //指针向后移动,并不改变num[0]的数据 printf("%f\n", nums[0]);//10 //首先取出*p的值44,接着*p=45, printf("%f\n", (*p)++);//44 //由于*p=45,改变了nums[1]的数据 printf("%f\n", nums[1]);//45 //p起初指向nums[1],++p后指向nums[2] printf("%f\n", *++p);//22 //首先取出*p的值22,++22=23 printf("%f\n", ++*p);//23 //首先取出*p的值23,++23=24,*p=24 printf("%f\n", ++(*p));//24 //*p=24,nums[2]的数据被改变 printf("%f\n",nums[2]);//24 getchar(); }
1)用指针变量指向数组元素
数组名表示数组的首地址的地址常量,将数组名赋值给指针变量,只是数组的首地址赋值给指针变量,而不是所有元素的地址
#include<stdio.h>
void main()
{
int num[10];
int* p = num;//指向数组首地址
int* p1 = &num[0];//指向数组元素
//数组名是一个常量指针,实际上就是一个地址
printf("%x\t%x", num, &num);//fdfec8 fdfec8
getchar();
}
2)数组元素表示方法
#include<stdio.h> void main() { int num[4] = {1,2,3,4}; int* p =num; for (int i = 0; i < 4;i++) { printf("%d\t", num[i]); printf("%d\t", *(num+i)); printf("%d\t", p[i]); printf("%d\t", *(p + i)); } getchar(); }
数组指针(也称行指针)
定义 int (*p)[n];
p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,执行p+1时,p要跨过n个整型数据的长度。
#include<stdio.h> void main() { //二维数组在内存中也是线性排列 int a[3][4] = { 34, 234, 65, 23, 54, 82, 99, 55, 22, 654, 23, 12 }; //p是一个指针,指向一个整型的一维数组,这个一维数组的长度是4 int(*p)[4] = a;//数组指针(行指针) //代表第0行首地址 printf("%x\n", *p); //18f8dc printf("%x\n", &a[0]);//18f8dc printf("%x\n", a);//18f8dc printf("%d\n", sizeof(*p));//16 printf("%d\n", sizeof(p));//4 printf("%d\n", sizeof(p[0]));//16 //*p + 1表示列指针 printf("%d\n", sizeof(*p + 0));//4 //p等价a[0]、P+1等价a[1] printf("%x\t%x\t%x\n", p, p + 1, p + 2);//1df7b4 1df7c4 1df7d4 printf("%x\t%x\t%x\n", a[0], a[1], a[2]);//1df7b4 1df7c4 1df7d4 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { //二维数组元素表示发法 printf("%d\t", p[i][j]); printf("%d\t", *(*(p + i) + j)); printf("%d\t", *(p[i] + j)); printf("%d\t", a[i][j]); printf("%d\t", *(*(a + i) + j)); printf("%d\t", *(a[i] + j)); } printf("\n"); } getchar(); }
说明:
1)行指针每加1,走一行
a代表第0行首地址
a+i代表第i行首地址
2)列指针每加1,走1列
a[0]代表a[0][0]的地址
a[i]+j代表a[i][j]的地址
3)*(*(a+i)+j)代表a[i][j]元素的值,而*(a+i)+j代表a[i][j]的地址
标签:
原文地址:http://www.cnblogs.com/ginb/p/4375980.html