一.指针介绍
- 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
#include<stdio.h>
#include<stdlib.h>
//
//一级指针的定义
int main()
{
int a = 10;
int* p = &a;
printf("%d\n", *p);//指针p存放着a的地址,通过解应用找到p所指向空间的值
system("pause");
return 0;
}
- 指针的大小是固定的4/8个字节(32位平台/64位平台)。
- 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
即:int类型指针加1或者减1会跳过4个字节
char类型的指针加1或者减1跳过1个字节 - 指针的运算
(1)指针±指针:
//指针+-整数
int main()
{
int arr[4] = { 1, 2, 3, 4 };
int* p = arr;//arr表示首元素地址
p++;
printf("%d\n", *p);//2
system("pause");
return 0;
}
(2)指针-指针
int my_strlen(char* p)
{
char* s = p;
while (*s != '\0')
s++;
return s - p;
}
int main()
{
char str[]= "asdf";
int len = my_strlen(str);
printf("%d\n", len);// 4
system("pause");
return 0;
}
二.指针分类
(1)一级指针。
例如:int* q =&a;
(2)二级指针。
例如:int** p = &q;
(3)指针数组:指针数组是一个存放指针的数组
例如:int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
(4)数组指针:它是一个存放数组的指针。
例如:int *p1[10];//指针数组
int (*p2)[10];//数组指针
(5)函数指针:
例如:void (*pfun1)()//函数指针
void *p1fun2 ()//不是函数指针
(6)函数指针数组:
例如:int (*parr1[10]])()
(7)指向函数指针数组的指针:
它是一个存放函数指针数组的指针。
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
//函数指针pfun void (*pfun)(const char*) = test;
//函数指针的数组pfunArr 比特科技
void(*pfunArr[5])(const char* str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr; return 0;
}
三.数组传参和指针传参
1.数组传参:
总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。 因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。 这样才方便运算。
数组传参可传数组也可传地址。
传地址用指针接收,或者传数组用数组接收。
2.指针传参:传地址用指针接收。