天天看点

C语言复习(三)——指针(一)指针基础

指针在C语言中是比较重要的,个人认为,C语言中最重要的是内存,如何操作内存是至关重要的,指针是C语言的精华,学好了指针才可以说C语言入了门。接下来认真总结一下C语言中指针的用法。

指针基础

1、指针是一种数据类型

数据类型的本质是固定大小内存块的别名,指针毫无例外,指针也是占有内存空间的,在32位机器中,指针是占4个字节的,指针存储的是一个地址,通过这个地址可以访问到一段内存空间。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(void)
{
	int *p = NULL;
	char *s = NULL;
	printf("%d %d", sizeof(p), sizeof(s));
	system("pause");
	return 0;
}
           

2、指针变量

指针也是一种变量,它的值为另一个变量的地址。

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;     /* 一个字符型的指针 */
           

不同类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

*号

在指针声明时,*号表示所声明的变量为指针;、

在指针使用时,*号表示操作指针所指向内存空间中的值。

*p相当于通过地址(p变量的值)找到一块内存;然后操作内存

*p放在等号的左边赋值(给内存赋值)

*p放在等号的右边取值(从内存获取值)

3、指针变量和它所指向的内存块是两种不同的概念

指针变量存储的是4个字节大小的内存地址,指针所指向的内存块里存储着另一个变量的值。

4、指针的步长,根据所指向的内存空间的类型来决定。

int main(void)
{
	int *p1 = NULL;
	//int *p2 = NULL;
	char *p3 = NULL;
	float *p4 = NULL;
	int a;
	int b[10];
	char c;
	float d;
	p1 = &a;
	//p2 = &b;
	p3 = &c;
	p4 = &d;
	printf("%d %d\n", p1, p1 + 1);
	printf("%d %d\n", &b, &b + 1);
	printf("%d %d\n", p3, p3 + 1);
	printf("%d %d\n", p4, p4 + 1);
	system("pause");
	return 0;
}
           

注意

  1. 指针指向谁,就把谁的地址赋给指针
  2. 不断的给指针变量赋值,就是不断的改变指针变量,就是不断的修改指针的指向(和所指向的内存空间里的值无关)

间接赋值

void f(int *p)
{
	*p = 30;
}

int main(void)
{
	int a = 10;
	int *p = NULL;
	p = &a;
	*p = 20;//p的值是a的地址,通过这个地址找到一段内存空间,间接的修改了a的值;
	printf("a = %d\n", a);
	f(p);
	printf("a = %d\n", a);
	system("pause");
	return 0;
}
           

我们可以通过被调用函数间接的修改某一变量的值,也就是说,我们可以通过一个函数将运算的结果传出来,或许我们可以给函数加上返回值,但是函数返回值只能把一个运算结果返回,如果我们要修改两个或两个以上的变量的值呢,这样的方法显然就不适用了,这就是指针作为函数参数间接修改变量的值的精华之处。

指针、函数与内存四区

  1. 主调函数与被调函数:

    a) 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数

    b) 被调用函数只能返回堆区、全局数据

  2. 内存分配方式

    a) 指针做函数参数,是有输入和输出特性的。

    输入:指针所指向的内存空间是在主调用函数中分配好的

    输出:指针所指向的内存空间是在被调用函数中分配好的

继续阅读