C语言___指针

一、定义的理解 

网址:https://www.cnblogs.com/tongye/p/9650573.html

内存:其实就是一组有序字节组成的数组,每个字节它有唯一的内存地址

也可以这样理解: 内存是数组,里面存放的值是地址

指针保存的是  地址

有句话是这样说的:指针是一种保存变量地址的变量

 

1B  = 1 字节

 1 字节=1B=8bit

对这些连续的字节从 0 开始进行编号

二、为什么要使用指针

  在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:

1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

(不一定,多加试验)

三、如何声明一个指针

3.1 声明并初始化一个指针

  指针其实就是一个变量,指针的声明方式与一般的变量声明方式没太大区别:

指针的声明比普通变量的声明多了一个一元运算符 “*”。运算符 “*” 是间接寻址或者间接引用运算符。当它作用于指针时,将访问指针所指向的对象。在上述的声明中: p 是一个指针,保存着一个地址,该地址指向内存中的一个变量; *p 则会访问这个地址所指向的变量。

即:p 是一个指针保存着一个地址,该地址指向内存中的一个变量 (记住一开始说的,内存里的变量,变量的值是地址)

     *p 指 值

int *p;        // 声明一个 int 类型的指针 p
char *p        // 声明一个 char 类型的指针 p
int *arr[10]   // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组 (有括号,优先级高)
int **p;       // 声明一个指针 p ,该指针指向一个 int 类型的指针

新手错误:

注意:定义指针时,一定要给它个地址,不然,程序不会报错,但在输出最后结果时,会出错

  ( 如果一个指针没有被初始化,那么程序就不知道它指向哪里。它可能指向一个非法地址,这时,程序会报错,在 Linux 上,错误类型是 Segmentation fault(core dumped),提醒我们段违例或内存错误。它也可能指向一个合法地址,实际上,这种情况更严重,你的程序或许能正常运行,但是这个没有被初始化的指针所指向的那个位置的值将会被修改,而你并无意去修改它。)

# include "stdio.h"

void main()
{
	int x=1;
	int *p;             // 这个是非法指针,没有给地址  程序不报错,但是在输出最后结果时,会报错
	*p=2;
	printf("%d",*p);


}

改正
# include "stdio.h"

void main()
{
	int x=1;
	int *p=&x;             // 就只是改了这一处,指针p 有地址,是 x 的地址 
	*p=2;
	printf("%d",*p);


}

3.2 NULL指针 ( 很特别)

NULL 指针是一个特殊的指针变量,表示不指向任何东西。可以通过给一个指针赋一个零值来生成一个 NULL 指针。

#include "stdio.h"

int main(){
    int *p = NULL;
    printf("p的地址为%d\n",p);

    return 0;
}

/***************
 * 程序输出:
 * p的地址为0
***************/

  

 可以看到指针指向内存地址0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。

四、指针的运算

  C 指针的算术运算只限于两种形式:

1) 指针 +/- 整数 :‘

可以对指针变量 p 进行 p++、p--、p + i 等操作,所得结果也是一个指针,只是指针所指向的内存地址相比于 p 所指的内存地址前进或者后退了 i 个操作数。用一张图来说明一下:

  在上图中,10000000等是内存地址的十六进制表示(数值是假定的),p 是一个 int 类型的指针,指向内存地址 0x10000008 处。则 p++ 将指向与 p 相邻的下一个内存地址,由于 int 型数据占 4 个字节,因此 p++ 所指的内存地址为 1000000b。其余类推。不过要注意的是,这种运算并不会改变指针变量 p 自身的地址,只是改变了它所指向的地址。

 2)指针 - 指针

只有当两个指针都指向同一个数组中的元素时,才允许一个指针减去另一个指针。两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。举个例子:

#include "stdio.h"
int main()
{
	int a[10] = {1,2,3,4,5,6,7,8,9,0};
	int sub;
	int *p1 = &a[2];
	int *p2 = &a[8];
	
	sub = p2 - p1;
	printf("%d",sub);// 输出结果为 6  9-3

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值