一:
问题1:(调用函数来交换ab)
该代码输出并不能实际交换值,只是形参交换。
交换地址才能实现ab两数的交换。通过地址间接交换ab
经典题:
point:++在左先加在赋值,++在右先赋值在运算(上下两题充分说明)
与上述相同的++在右先赋值在做++运算
2.野指针:
int *p;改为野指针,segmentation fault(可能会报段错误)该位置被占用不能进行赋值
*p = 100; //segmentation fault
int *p = NULL//空指针,便于后续判断但还是不能访问,可控的。
malloc(32);//malloc函数向操作系统申请分配内存(堆内存)该函数返回的是void*类型,返回时必需要强制转换:
free(str)//释放malloc申请的内存
//优秀代码
先放ch到str[]中再i++。//后置运算有一定优势。
3.指针与数组
a[i]=*(a+i)
通过数组的形式来访问指针
4.指针与数组的区别
"helloworld"用""括起来的被放在只读存储区且字符串常量不能被修改,但a[]="hello"在赋初值是这不是。
指针和数组在内存上的区别:
int a[5];
/*
&a表示数组的地址,&a++直接跳过一个数组
a表示数组首元素地址,a++表示指针向下移动一个字节。
(int*)(&a+1)把数组的地址强制转换为数组第一个元素的地址
*/
5.求数组的中含的元素而不是数组长度(字节)
6.指针数组
#include<stdio.h>
int main()
{
char *string[] = {"i love yon ","i am"}; //[]的优先级在c语言中的优先级高,所以他先是一个指针。
printf("%c\n",string[0]);
return 0;
}
二.高级指针
1.函数与指针:
函数名就是该函数所占内存区的首地址。
指针函数返回值为指针的函数:
由于str[32]为局部变量,不能作为指针函数的返回值
int(*p)()和int *p()的区别:(右左法则)(函数指针和指针函数)
int(*p)():p是一个指针指向函数()的指针并且返回值为int。
int *p():返回值是指针的函数。
2.回调函数(用到指针)
把函数名作为另一个函数的参数,修改函数的功能
以下是复杂的函数声明:
1.指针作为函数的参数:在传值的效率高函数指针
//定义函数指针的全过程
void f1()
{
printf("helloworld\n");
}
int main()
{
void (*p)();//定义函数指针 ()代表指向的函数
p = f1;
p(); //通过函数指针来调用函数 相当于f1括号
return 0;
}
//接下来我们定义一个有形参有返回值的指针函数
int add(int x,int y)
{
return x+y;
}
int main()
{
int (*q)(int,int) =add;//函数名相当于地址
}
接下来typedef 来定义该复杂的类型
函数指针最大的用处就是用于回调函数
typedef int (*T)(int,int);//声明一个新的类型T T表示函数指针类型
T q1;//等价于 int (*q1)(int ,int);
指针函数
返回值是指针的函数(注意不能返回局部变量的地址)
#include <stdio.h>
char *init() //char *代表返回值为指针的函数
{
//char str[32] = {0}; //但是该变量为栈空间,为局部变量,程序或函数执行完会被释放
char *str = (char*)malloc(128);//所以我们可以可以申请一个堆内存
return str;
}
int main()
{
char *s = init();
strcpy(s,"hello");
free(s); //释放申请的空间
return 0;
}
就上述两种做出区分:函数指针与指针函数
int(*p)()
int *p() 指针函数返回指针
三:回调函数
通过函数指针,把函数中的一个返回值(函数)用函数指针来代替这样就可以传递不同的函数便于变化。如下述的p()。回调函数的功能修改函数的功能
#include <stdio.h>
int main()
{
int a[10] = {0};
int i;
for (i = 0;i < 10;i++)
{
scanf("%d",&a[i]);
}
}
c语言的知识:int f(); //()表示括号中能接收任意的参数
四:
指针数组与数组指针
指针数组是数组:数组中的每个元素都是指针 例:int *pa[3];
表示pa是一个指针数组,它有三个元素,每个元素值都是一个指针,指向整型变量。
用指针数组来表示二维数组;
数组指针是指针:该指针指向数组 例:int (*p)[5];
p是一个指针,指向一个数组,该数组有5个元素,每个元素都是整型
明确二维数组的概念:
a表示数组首行地址 a+1 :表示一行一行的加
a[0]:表示首行首元素的地址
&a表示数组的地址
用数组指针来表示二维指针:
指针和二维数组的关系:
在c语言中强制类型转换不会修改值的,但会修改类型。
五:
指针的指针:
多级指针
int a = 1;
int *p = &a;
int **q = &p;
//**q就是a q是指针q的地址
例:
一定要先算前置运算,例如:printf(“%s”,*--*++cpp + 3); 先要运算++在--
六:命令行参数