[NOTE-C]C语言指针详解(一)

C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的利用C指针!

指针变量的定义初始化和解引用

内存如何编址?

内存中的每个字节都有唯一的编号(地址),内存地址按字节编号,其字长一般与主机相同,32位机器使用32位地址,最多支持2^32字节内存(4G)
地址是一个无符号整数,从0开始依次递增,通常地址写成16进制。

如何对变量进行寻址?

直接寻址
直接到变量名标示的存储单元中读取变量的值

scanf("%d", &a);//假如忘记写&符号,a的值被当成地址。比如a为100,则会覆盖内存中地址为100位置的值。
printf("a=%d\n",a);

间接寻址
通过其他变量间接地找到变量地址读取变量的值

用什么类型来存储地址? 指针Pointer类型

指针变量
具有指针类型的变量
保存32位地址值 sizeof(pa)是4个字节
用什么数据类型去理解他所指向的存储单元中的数据呢?

int *pa;  int *pa = &a

int 指针变量指向的数据类型 称为基类型
指针变量的内容 &a
指针变量pa是变量a的指针

如何显示变量的地址

使用%p格式符
变量指针只能指向同一基类型的变量

使用未初始化的指针会怎样?

指针变量使用之前必须初始化
若不知指向哪里 那就指向NULL(stdio.h中 定义为0)
NULL是什么
空指针-值为NULL的指针 即无效指针
问题:p=0和p=NULL有什么区别
A:*p=NULL可以明确的说明p是指针变量,而不是数值型变量
问题:空指针就是指向地址为0的存储单元的指针对么?
A:不一定,并非所有编译器都是用0地址,某些编译器为空指针适用不存在的内存地址

如何访问指针变量指向的存储单元中的数据

通过间接寻址运算符访问(引用)指针变量指向的变量的值
指针的解引用(Pointer Dereference)
*pa

指针变量的定义和初始化

正确方式

int *pa,*pb;

错误方式

int *pa,pb;

需要严格注意区分

指针变量作为函数参数

指针变量的解引用如何理解

间接寻址运算符 此* 非彼*
只要pa指向a,*pa就是a的别名

指针变量做参数有何优势

基本类型的变量做函数参数
Call By Value Passing arguments by value
实参变量的值->形参(parameter)
在被函数中不能改变实参的值
指针类型的变量做函数参数
Simulating Call by reference- Passing arguments by reference
是参变量的地址->指针形参(pointer parameter)
在被调函数中可以改变实参的值

Call by value

#include <stdio.h>
void Fun(int par);
int main()
{
 int arg = 1 ;
 printf("arg = %d\n", arg);
 Fun(arg);
 printf("arg = %d\n", arg);
 return 0;
}
void Fun(int par)
{
 printf("par = %d\n", par);
 par = 2;
 return 0;
}

Call by reference

#include <stdio.h>
void Fun(int *par);
int main()
{
 int arg = 1 ;
 printf("arg = %d\n", arg);
 Fun(&arg);
 printf("arg = %d\n", arg);
 return 0;
}
void Fun(int *par)
{
 printf("par = %d\n", *par);
 *par = 2;
 return 0;
}

指针变量作形参为函数
提供了修改实参值的手段

实战:两数交换

方案一:使用指针变量

需要注意
* 要传递地址给指针
* 实参形参数据类型要一致
* temp为整形 这里不要写错为指针类型

int main()
{
 int a = 5, b = 9;
 Swap(&a, &b);
 printf("a=%d,b=%d",a,b);
 return 0;
}

void Swap(int *x, int *y)
{
 int temp;
 temp = *x;
 *x = *y;
 *y = temp;
} 

方案二:通过数组

数组这里也是传引用

int main()
{
 int a[2] = {5, 9};
 Swap(a);
 printf("%d,%d", a[0],
a[1]);
 return 0;
} 

void Swap(int p[])
{
 int temp;
 temp = p[0];
 p[0] = p[1];
 p[1] = temp;
} 

想了解更多其他技术博文,后续更多文章可以在Montage GTD来订阅RSS啦

0条留言