-
取值运算符
*
#include <stdio.h> int main() { int a = 10; printf("a=%d\n",a); printf("a的地址是:0x%p\n",&a); printf("a=%d\n",*(&a));// * 是取值运算符, //他把后面跟的内存地址中的数据“取出来” return 0; }
-
指针变量
指针变量就是存放地址的变量。
int *p;// 这里的*是一个标识符(标识作用只产生在指针变量定义和声明的时候) //告诉系统我是一个指针变量,是用来保存别人地址的,和下方的运算符不同 printf("a=%d\n",*p);//这里的*是取值运算符(运算作用)bg
-
定义一个指针变量指向数组,指针变量保存的时数组首个元素的地址。
int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; p = &a[0]; p = a;
-
用指针法遍历数组
int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p; p = a; for(int i = 0;i<3;i++){ printf("%d ",*(p+i));//p+1不是地址数值加1而是偏移,偏移量与指针类型相关 }
-
对于使用指针和数组下标的选择:
系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率远远大于数组名的访问效率的。
但是只有在指针正确访问时,才能比下标法更有效率、
下标法更加容易理解,在可读性方面,也更加的具有优势,具体怎么选择,也没有一定的说法。
-
见怪不怪
-
指针当做数组名,下标法访问
for(int i = 0;i<3;i++){ printf("%d ",p[i]); }
-
数组名拿来加
for(int i = 0;i<3;i++){ printf("%d ",*(a+i)); }
-
数组名拿来自加(a++)
编译不通过。
数组名代表数组首元素的地址,是个地址常量,不能改变。而定义的指针是变量,可以改变。
for(int i = 0;i<3;i++){ printf("%d ",a++);//不可以,数组名代表数组首元素的地址,是个地址常量,不能改变 }
-
-
练习函数指针数组
#include <stdio.h> /* 定义一个数组 函数封装初始化数组 函数封装输出数组 */ void initArray(int *array,int size) { for(int i = 0;i<size;i++){ printf("请输入第%i个元素:",i+1); scanf("%d",array++); } } void printArray(int *array,int size) { for(int i = 0;i<size;i++){ printf("%d ",*array++); } putchar('\n'); } int main() { int array[5]; int size = sizeof(array)/sizeof(array[0]); initArray(array,size); printArray(array,size); return 0; }
-
逆序输出数组
/* 将数组中的n个元素按逆序存放 例:输入11,22,33,44,55 输出55,44,33,22,11 经过推理,数组元素个数的奇偶对算法没有影响。 */ int niXuArray(int *array,int len) { int tmp; for(int i = 0;i<len/2;i++){ int j; j = len-1-i; tmp = array[i]; array[i] = array[j]; array[j] = tmp; } return *array; }