1.指针的定义
所谓的指针指的是指针变量(Pointer)。 从这个单词我们就可以看出这是指向(point)某个存在的东西(er)。即在计算机中,它(指针变量)指的是指向某个内存单元的一个变量。如下图:
int a = 0;//定义一个整形变量a
int* b = &a;//&为取地址符号,将a的地址传给b,b为指向a的一个整形指针.
2.指针类型的意义
上面我们谈到了指针是一个变量。从C语言来看,我们定义一个变量,必须要指定变量的类型。那么,当我们谈到指针变量时,我们也要制定它的类型。
指针变量是指向某个内存单元的一个变量。内存单元是存放数据的。某个内存单元并没有所谓的类型之分。从某种角度看,其实是内存单元存放的变量类型,决定了我们指针的类型。所以,我们的指针类型是由其指向内存地址存放的变量的类型决定的。因此,可以有int*,char*等等。
当指针的类型得以确定,那么对指针进行解引用时具有多大的权限。
3.指针的运算
3.1指针与整数的运算
#include <stdio.h>
//指针+- 整数
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
printf("%d ", *(p+i));//p+i 这⾥就是指针+整数
}
return 0;
结果为
1 2 3 4 5 6 7 8 9 10
当我们运行代码,就可以看到依次打印数组的各个元素。*(p+i)等价于p[i],此时整数相当于数组中的元素(位置)。
3.2指针-指针
//指针-指针
#include <stdio.h>
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;//非零元素的末地址-初地址
}
int main()
{
printf("%d\n", my_strlen("abc"));
return 0;
}
结果为
3
运行结果我们可以看到返回的是两指针之间的元素个数。
3.3指针的关系运算
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
while(p<arr+sz) //指针的⼤⼩⽐较
{
printf("%d ", *p);
p++;
}
return 0;
}
结果为
1 2 3 4 5 6 7 8 9 10
代码运行的结果是,打印的是数组的各个元素。
代码中,p存的是首元素的地址,而arr+sz(首元素+元素个数即末元素的地址)
4.指针数组
从语法角度来看。指针修饰数组,即指的是数组。指针数组就是存放指针的数组。如
int a = 0;
int* b = &a;
int* p[1] = {b};
5.指针数组名是什么
一般情况下数组名就是首元素的地址。(两种例外,1是用sizeof(数组名),此时数组明为整个数组2.&数组名时也代表整个数组)
因此,指针数组名是首元素(指针)的指针,即二级指针。
#include <stdio.h>
int main()
{
int a = 0;
int* b = &a;
int* p[1] = {b};
printf("%d",**p);
return 0;
}
结果为
0
当我们需要打印时,需要解引用两次。
6.数组指针
从语法角度来看。数组修饰指针,即指的是指针。数组指针就是指的是指向数组的指针。如
int (*p)[10] = {0};
p在括号里面先与*结合在与[10]结合,指向数组
7.函数指针
首先,先把结论放在这里:函数也是有地址的。
那么,指针就是专门来指向地址的变量,因此也可以用指针来指向函数,就叫做函数指针。如
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("test: %p\n", test);
printf("&test: %p\n", &test);
return 0;
}
结果如下:
test: 005913CA
&test: 005913CA
8.函数指针数组
从语法角度来看。函数指针修饰数组,即本质是数组。函数指针数组指的是存放函数指针的数组。如
int (*parr1[3])();
在里面的括号里面,parr1先跟数组结合代表是数组,然后和*结合代表指针数组,在外面即为返回值为int型号的,没有形参的一个函数,总结一下就是函数指针数组(外》》内)
PS:举例引用的代码大都拷贝与比特就业课《鹏哥C语言》的课件。