1.指针是什么?
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为‘指针’。意思是通过它能找到以它为地址的内存单元。
内存 :
最小内存单元----bit
1byte=8bit
1kb=1024byte
1mb=1024kb
1gb=1024mb
总结: 指针就是变量,用来存放地址的变量(存放在指针中的值都被当成地址处理)。
2.指针和指针类型
指针定义方式为" type+* "
例
int num = 10;
int* p = # //p是指针变量,p里存放的是num的地址
同理
char* pc = NULL;
int* pi = NULL;
short* ps = NULL;
long* pf = NULL;
double* pd = NULL;
**总结:**指针的类型决定了指针向前或者向后走一步有多大(距离)
3.指针的运算
1).指针±整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
2).指针-指针
得到的是元素个数(绝对值)
比较于日期–例如,日期-日期为相差多少天
4.指针和数组
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
printf("%p\n", arr);//首元素地址
printf("%p\n", arr+1);//第二个元素地址
printf("%p\n", &arr[0]);//首元素地址
printf("%p\n", &arr);//数组地址,且数组地址和首元素地址是一样的
printf("%p\n", &arr+1);//下一个数组地址
总结: 数组名表示的是首元素地址,除了两个例外:sizeof(arr)//arr表示整个数组
printf("%p\n",&arr)//arr表示整个数组。
5.字符指针
char ch = 'w';
char* pc = &ch;
char* pstr = "hello";//将首字符的地址放到pstr里,且*pstr不可被改,“ ”是常量字符串
printf("%s\n", pstr);
6.指针数组
int* arr1[5];
char* arr2[5];
arr1表示一个数组,有五个元素,每个元素是一个整型指针。
arr2表示一个字符数组,每个元素都是一个字符指针。
7.数组指针
int(*p)[10];
p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10 个整型的数组。
所以p是一个指针,指向一个数组,叫数组指针。即p里存放的是数组的地址。
8.函数指针
void test()
{
printf("hehe");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);//这两种写法都可以
}
pfun可以存放Add的地址。pfun先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数参数为 int int,返回类型为int.
int Add(int a, int b)
{
return a + b;
}
int main()
{
int(*pfun)(int, int) = Add;
printf("%p\n", pfun);
9.函数指针数组
把函数的地址存到一个数组中,那么这个数组就叫函数指针数组。
int(*parr[10])(int,int);
把一个函数,参数为(int,int),返回类型为int,的函数地址存放到指针数组里,即parr[10]里。
10.指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。
定义:
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
//函数指针pfun
void(*pfun)(const char*) = test;
//函数指针的数组pfunArr
void(*pfunArr[10])(const char* ) = pfun;
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void(*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}