指针的深入

一:

问题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); 先要运算++在--

六:命令行参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值