本案例代码非原创 , 我只是按照学习的过程自己重敲一遍回顾学习!
1.指针介绍
#include <stdio.h>
#pragma mark - 获取最大值
int getMaxNum(int i,int j)
{
return i > j ? i : j;
}
#pragma mark - 获取最小值指针地址
int *getMinNum(int i,int j)
{
int result = i < j ? i : j;
int *pResult = &result;
return pResult;
}
#pragma mark - main函数
int main(int argc, const char * argv[]) {
/**
* 普通指针:
*/
printf("普通指针:\n");
printf("--------------------\n");
int a = 4;
// 指针赋值:
int *pa = &a;
printf("a=%d\n" , a);
printf("&a=%p\n" , &a);
printf("pa=%p\n" , pa);
// 指针取值:
printf("*pa=%d\n" , *pa);
/**
* 指针的指针 ppa->pa->a
*/
printf("指针的指针 ppa->pa->a\n");
printf("--------------------\n");
int **ppa = &pa;
// 获二级指针pa的地址&pa:
printf("&pa = %p\n",&pa);
// 获取二级指针pa的地址 , 一样是&pa的地址 . 因为ppa是一个二级指针 , 而&pa一样是该二级指针的地址!
printf("ppa = %p\n",ppa);
// 获取一级指针的地址 , 其实这里的一级指针的地址就是一个 int* 类型的指针对象 , 一级指针的地址恰好就是&a的地址值 , 也就是第一个案例中的地址值:
printf("*ppa = %p\n",*ppa);
// 获取二级指针指向的一级指针对象里保存的对象值 , 也就是a = 4 , **ppa是一个int类型的对象 , 那自然就是4 了~
printf("**ppa = %d\n",**ppa);
/**
* 数组指针: ☆☆☆数组的地址就是数组元素首地址☆☆☆
*/
printf("数组指针\n");
printf("--------------------\n");
char b[] = "hello";
char *pb = b;
printf("b = %p\n",b);
printf("pb = %p\n",pb);
printf("--------------------\n");
// 1.查看每个元素的地址:
for (int i = 0; i < 5; i++) {
printf("&b[%d] = %p\n",i,&b[i]);
}
printf("--------------------\n");
//2.用下标取值:
for (int i = 0; i < 5; i++) {
printf("b[%d] = %c\n",i,b[i]);
}
printf("--------------------\n");
// 3.用指针取值:
// 为什么这里可以用 (b+i) 取值 , 只因为数组在内存上是一段连续区域 ,你 + 1就是下一段内存 , 恰好就是给下一个数组元素的!
for (int i = 0; i < 5; i++) {
printf("*(b+%d) = %c\n",i,*(b+i));
}
/**
* 函数指针
*/
printf("函数指针\n");
printf("--------------------\n");
int (*p1)(int, int);
p1 = getMaxNum;
int result = p1(3,5);
printf("max = %d\n",result);
/**
* 返回指针的函数
*/
printf("返回指针的函数\n");
printf("--------------------\n");
int *p2 = getMinNum(3, 5);
printf("min = %d\n",*p2);
return 0;
}