c语言——指针

定义指针变量:

类型名 *指针变量名

char  *pa ; //定义一个指向字符型的指针变量
Int  *pb ; //定义一个指向整型的指针变量

指针和指针变量

  • 存放的值叫做指针
  • 存放地址的变量叫做指针变量

取地址运算符和取值运算符

如果需要获取某个变量的地址,可以使用取地址运算符(&):

char  *pa = &a;
int  *pb =  &f;

如果需要访问指针变量指向的数据,可以使用取值运算符(*):

prinrf(“%c, %d \n”, *pa, *pb);

指向数组的指针

char *p;
p = a; //语句1
p = &a[0];  //语句2

指向数组就是指向数组第一个元素的地址。语句1和语句2相等

避免使用未初始化的指针

指针的运算:

当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做对意义相当于指向距离指针所在位置向前或向后第n个元素

对比标准型下标访问数组元素,这种使用指针进行间接访问的方法叫做指针法。
注:p+1并不是简单地将地址加1,而是指向数组的下一个元素。

指针与数组的区别

指针和数组名都指向一个地址
但是数组名只是一个地址,而指针是一个左值。(应该是可以进行解引用的???)

int *p1[5];指针数组

指针数组:指的是每个元素都是整型的指针变量

下标01234
元素int *int *int *int *int *

int (*p2)[5];数组指针

数组指针:是一个指针,指向的是一个数组

下标01234
元素intintintintint

指针与二维数组

int array[5][5];

*(array+1)表示第二行的首地址的值
*(array+1) == array[1]

((array+1)+3)表示第二行第四列的值

void指针

void指针通用指针,就是可以指向任意类型的数据。任何类型的指针都可以赋值给void指针。

NULL指针

不清楚要将指针初始化为什么地址时,请将它初始化为NULL。在对指针进行解引用时,先检查指针是否为NULL。

指向指针的指针

#include <stdio.h>
int main( )
{ 
        int num =520;
        int *p = &num;
        int **pp = &p;
        return 0;
  }

指针数组和指向指针的指针
至少有两个好处:
1、避免重复分配内存
2、只需要进行一处修改

常量:

宏定义

#define

还可以使用const关键字修饰

指向常量的指针

#include <stdio.h>
int main()
{
    int  num = 520;
    const int cnum = 880;
    const int *pc = &cnum;
     pc = &num;
     printf(“pc: %d, pc: %p\n”, *pc, pc);
}

指向常量的指针(int * const p = #)
总结:

  • 指针可以修改为指向不同的常量
  • 可以通过解引用来读取指针指向的数据
  • 不可以通过解引用修改指针指向的数据
    常量指针
  • 指向非常量的常量指针
    -指针自身不可以被修改
    -指针指向的值可以被修改
  • 指向常量的常量指针(const int * const p = # )
    -指针自身不可以被修改
    -指针指向的值也不可以被修改

形参实参:

形参只是一个占位符,只在函数内部有效

传值和传址:
传值时在函数中修改,并不会影响main函数中的值
传地址修改,会影响main函数中的值

传数组:
并不是以数值的形式传到函数中,而是以地址的方式传到函数中。
可变参数

#include <stdarg.h>
-va_list
-va_start
-va_arg
_va_end

指针函数

int *p();

注:不要返回局部变量的指针

函数指针

#include <stdio.h>
int square(int);
int square(int num)
{
    return num*num;
}
int main( )
{
    int num;
    int (*fp)(int);
    printf(“请输入一个整数:”);
    scanf(“%d”,&num);
    
    fp = &square;
    prinrf(“%d*%d=%d\n”,num,num,(*fp)(num))
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值