c---指针

有三种内存的分配方式:

1.静态存储区分配,编译期间就已经分配好,一直存在(函数外部变量,static);

2.(动态)栈创建,处理器自行处理,效率高但是内存有限(函数参数,局部变量);

3.(动态)堆分配,程序员分配,自行管理,存在内存碎片,容量大(malloc/free)。

为什么使用指针

结构紧凑

运行效率高

可表示一些复杂的数据结构类型

可以让函数返回多值

函数就是指针

动态分配内存,灵活

指针的基本知识

两个部分:地址+该指针的类型

两种类型:数据指针和函数指针

指针与地址的区别:一个变量,一个常量

占用内存大小

32位机器  - 4byte

64位机器 - 8byte

指针的使用

1.定义

int a = 1;

// int * p = 3;//错误,野指针,未指向任何内存

int * p = &a;//使用前先初始化,p指向a的地址

2.指针与字符串,数组

char arr[5] = {'a','b','c'};// 内存 a b c  .  .  /o

char * p = "abc" // 内存 a b c /o

p++;//正确,指向b

arr ++;//错误 arr : 元素首元素的地址 &arr :数组指针

3.指针与二位数组

char arr[][5] = {"aaa","bbb","ccc"};

arr : 数组行指针

&arr:数组首列首地址

注意:

区别 int * p[], int (*p)[];

区别 二维数组和指针数组(就是区别数组和指针)

4.指针与函数

int p();

int *p();//函数,返回指针

int (*p)();//指针,指向返回int值的函数

int *(*p)();//指针,指向返回int型指针的函数

5.指针与函数参数方面的问题

5.1修改指针对应的值

//1.交换两个数的值;正确

void swap(int * a,int * b){

int temp = *a;

*a = *b;

*b = temp;

}

调用

swap(&a,&b);


//2.交换两个数的值;错误//仅仅改变了参数的地址,与原数据无关

void swap(int * a,int * b){

int * temp = a;

a = b;

b = temp;

}

调用

swap(&a,&b);

//3.交换两个数的值;正确//使用二级指针改变了源数据的指针

void swap(int ** a,int ** b){

int * temp = a;

a = b;

b = temp;

}

调用

swap(&a,&b);

你可能感兴趣的:(c---指针)