指针的概念:
指针就是变量,用来存放地址
指针的大小是固定的4/8个字节(32位平台/64位平台)
指针也是有类型的,指针类型决定了+-步长,指针解引用时的权限
字符指针
在前面的学习我们知道了字符指针的初阶应用
假如是字符串呢,字符指针该怎么运用
我们取出字符串abc中a的地址放到指针pa中,
我们以printf("%c\n", *pa); 打印当然是打印a了
printf("%s\n", pa); 打印字符串,pa是a的地址,从a的地址开始打印遇到\0结束
我们还有另外的写法
char* pa = "abc"; 取a的地址放到指针pa中
printf("%s\n", pa); 打印字符串从a的地址开始打印,遇到\0结束
#include <stdio.h>
int main()
{
char str1[] = "hello";
char str2[] = "hello";
char* str3 = "hello";
char* str4 = "hello";
if (str1 == str2)
{
printf("str1=str2\n");
}
else
{
printf("str1!=str2\n");
}
if (str1 == str3)
{
printf("str1=str3\n");
}
else
{
printf("str1!=str3\n");
}
if (str3 == str4)
{
printf("str3=str4\n");
}
else
{
printf("str3=str4\n");
}
return 0;
}
这个程序输出结果是多少
通过分析知道str1!=str2
所以str3==str4
输出的结果
指针数组
在前面我们文章我们也提过指针数组
指针数组本质还是数组,不过是存放指针罢了,即存放地址的数组
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5 };
int b[] = { 2,3,4,5,6 };
int c[] = { 3,4,5,6,7 };
int* arr[] = { a,b,c };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", *(arr[i] + j));
}
printf("\n");
}
return 0;
}
数组指针
数组指针是什么,通过主语关系我们也知道,数组指针是指针,前面有修饰词数组,那么就说明是存放数组的指针
存放数组的指针?
我们怎么用呢?
我们在前面中可以通过指针打印字符串,我们可以通过指针打印数组吗
不可以,因为字符串有结束标志\0,数组没有它的结束标志
[]的优先级大于*,所以我们加括号将* pa括起来,确保pa是指针类型
其实一维数组使用数组指针是不好的,因为它本身就是一个数组,你只能存整个数组的地址,不能很好的访问数组内的内容。
&数组名和数组名有什么区别呢
&数组名是直接取出数组的地址(默认是首地址),当&数组名+1是跳过整个数组
数组名是首元素的地址,数组名+1,是跳到数组的下一个元素
eg:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10};
printf("%p\n", arr);
printf("%p\n\n", &arr);
printf("%p\n", arr + 1);
printf("%p\n", &arr + 1);
return 0;
}
可以很容易看出数组名+1,然后地址+4,跳过一个元素四个字节
通过计算可以看出,&数组名+1,跳过了40个字节也就是10的元素,即整个数组
那么我们数组的使用场景是什么,我们数组指针可以运用到二维数组中,将二维数组模拟成一维的形式
我们知道数组指针是存储数组的,上面的代码怎么理解呢
数组参数、指针参数
当书写一个函数时,我们书写函数的形参可以怎么书写
一维数组的传参
我们常见的可以看到上面的三种传参方式
二维数组传参
一级指针传参
当要传指针给形参,我们可以用一级指针接收
那么我们形参是一级指针,实参是什么?
地址\一级指针
二级指针传参
当我们要传二级指针给形参时,我们可以用二级指针接收
形参是二级指针时,实参是什么?
一级指针地址、二级指针
函数指针
变量、数组有地址,那么我们的函数有没有地址呢?
我们看出,我们的函数也是有地址的,我们可以将地址存在指针中,所以我们就有了函数指针的概念
前面我们知道数组名表示数组首元素的地址
那么函数名可以表示地址吗?
可以看出,函数名也是可以表示函数的地址的
我们怎么使用函数指针呢
#include <stdio.h>
void print()
{
printf("hello\n");
}
int main()
{
void (*pa)() = print;//函数指针的定义,函数名就是函数得地址
print();
(*pa)();
pa();
return 0;
}
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("%d\n",Add(2, 3));
int (*pa)(int , int ) = Add;
printf("%d\n",pa(2, 3));
printf("%d\n",(*pa)(2, 3));
return 0;
}