------- android培训、java培训、iOS培训、.Net培训、期待与您交流! ----------
指针概念:
内存单元的编号也叫做地址。根据内存单元的编号或地址可以找到所需的内存单元,所以通常把这个地址称之为指针。
生活中实例:
银行账号是指针,卡里的钱是实际内容。
使用指针的好处:
- 为函数提供修改及调用变量的灵活手段
- 让函数有多个返回值
- 改善某些子程序的效率(传递的是一个地址而不是内容)
- 为动态数据结构(如二叉树、链表等)提供支持
指针是一个地址,是一个常量。
指针变量是存放一个地址,是一个变量。
定义格式:类型说明符 *变量名 = 地址;
指针也可以被声明为全局、静态局部和局部的。
指针的应用场景:1)在被调函数中可以修改主调函数中的变量的值。2)让函数可以有多个返回值。
#include <stdio.h>
void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){
//在函数的内部访问了主调函数中的变量值
*add = x+y;
*jian = x-y;
*cheng = x*y;
*chu = x/(float)y;
<pre name="code" class="plain">//用指针让函数可以有多个返回值,并不是有多个return
}int main(int argc, const char * argv[]) { int add=0; int jian=0; int cheng=0; float chu=0.0f; caculator(12, 4, &add, &jian, &cheng, &chu); printf("add = %d\n",add); printf("jian = %d\n",jian); printf("cheng = %d\n",cheng); printf("chu = %.2f\n",chu); return 0;}
二级指针概念:
如果一个指针变量存放的又是另一个指针变量的地址,则成这个指针变量为指向指针的指针变量,也称之为二级指针。
int a=10;
int *p=&a;//定义一个一级指针
int **p1=&p;//定义一个二级指针
printf("%p",&p); //p的地址
printf("%p",p1); //p1的内容,p的地址
printf("%p",*p1); //p的内容,a的地址
printf("%d",*p); //a的内容
printf("%d",**p1); //a的内容
在64位编译器中,任意指针变量都占用8个字节。
void *p; //可以将其强制转换成任意类型的指针
指针与数组
数组指针:
用一个指针变量指向一个数组元素,则它就是数组指针。
对于一个一维数组来说
int a[5];
1)获取 a[i]的地址有三种方法
(1)&a[i]
(2)a+i
(3) int *p = a;
p+i;
2) 获取 a[i]的值有四种方法
(1)a[i]
(2)*(a+i)
(3) int *p = a;
*(p+i);
(4)*(&a[i])
数组指针的应用:逆序数组
#include <stdio.h>
/**
* 逆序一个数组
*
* @param a 数组名
* @param len 数组长度
*/
void nixuArray(int a[],int len){
//定义数组指针
int *p = a;
//定义下标
int i = 0,j = len-1;
int temp;
while (i<j) {
//交换a[i] 和 a[j];
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
//修改下标
i++,j--;
}
}
int main(int argc, const char * argv[]) {
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//调用函数逆序数组
nixuArray(arr, 10);
//遍历数组
for (int i=0; i<10; i++) {
printf("%d\t",arr[i]);
}
return 0;
}
二维数组指针
格式:数据类型 (*指针变量名)[二维数组列数];
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
数组指针也称指向一维数组的指针,亦称行指针,每次加i都是移动一行的地址的大小,而非移动一个元素的地址大小
一维指针数组
概念:一个数组的元素值为指针则为指针数组
格式:类型说明符 *数组名[数组长度]
指针数组和二维数组指针的区别
指针与字符串
字符串指针
char *变量名="字符串内容";
char *s="C Language"; 则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。
二维字符串指针
char st[3][6]={"china","japan","korea"};
指针与函数
指针函数
指针类型 * 函数名(){
return 地址;
}
函数指针
返回值类型 (*变量名)(函数的参数);
函数的声明:
int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
定义了一个函数指针 p1
p1可以存放返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
函数指针的初始化
p1 = sum; //sum存的就是函数在内存中的首地址
#include <stdio.h>
int sum(int x,int y){
return x+y;
}
int jian(int x,int y){
return x-y;
}
int cheng(int x,int y){
return x*y;
}
int chu(int x,int y){
return x/y;
}
int main(int argc, const char * argv[]) {
//函数指针的使用
//1、定义函数指针
int (*p)(int ,int );
//2、给函数指针初始化
p = sum; //p也指向了sum函数
switch (3) {
case 1:
p = sum;
break;
case 2:
p = jian;
break;
case 3:
p = cheng;
break;
case 4:
p = chu;
break;
default:
break;
}
//3、用函数指针间接的调用函数
// (*p)(23,45);
int s = p(23,45);
printf("%d\n",s);
return 0;
}