指针
一.什么是字符指针
字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
c
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char* str3 = "hello bit.";
const char* str4 = "hello bit.";
if (str1 == str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if (str3 == str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
if (&str3 == &str4)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
上述代码中的运行结果
第一个 的运行结果为什么是不同的 :因为str1和str2是两个不同的字符数组,开辟的空间也是不同的
第二个 的运行结果是相同的:因为str3和str4都是字符串常量,指向的地址都是相同的
二.使用指针数组模拟二维数组
c
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//int* int* int*
//指针数组
int* a[3] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < sizeof(arr1) / sizeof(arr1[0]); j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
arr[i]就是相当于拿到了每个元素的数组名,j相当于拿到了每一列的数组名
三.函数指针
c
int Add(int x, int y)
{
return x + y;
}
int main()
{
//&函数名就是函数的地址
//函数名也是函数的地址
printf("%p\n", &Add);
printf("%p\n", Add);
int(*pf1)(int, int) = Add;
//int (*pf1)(int, int) = Add;//pf1就是函数指针变量
//int (* pf2)(int, int) = &Add;
//int ret = (* pf2)(2, 3);
//int (* pf2)(int, int) = Add;
//int ret = pf2(2, 3);
//int ret = pf2(2, 3);
int ret = Add(2, 3);
printf("%d\n", ret);
return 0;
}
1.首先需要一个指针变量
*pf1=Add
2.因为运算符的优先级所以*pf1需要用括号括起来
(*pf1)
3.是什么类型的,如果是int就是
int(*pf1)
,其他类型是一样的
上面函数参数是两个整型 ,所以第二个括号就是
int (*pf1)(int , int )
,两个参数可以省略
int ret = (* pf2)(2, 3);
对函数指针直接进行传参以上就是函数指针
c
int main()
{
( *(void (*)()) 0 )();
return 0;
}
上述代码所说的是,函数没有参数,返回类型是
void
,参数也是空,强转为函数指针类型
c
void (* signal(int,void(*)(int)))(int);
此代码是一次函数声明,声明的是signal函数
int
是signal函数的第一个参数,void (*)(int)
是此函数的第二个参数,是函数指针类型,参数是int,返回类型是void