C语言重点笔记五(上)——指针(指针赋值)

指针在C语言基础中非常重要,对后面学习C++或数据结构算法都有很大作用。

这是前面一部分哦!如果对大家有帮助的话,能否送个赞鼓励一下哇!!!

基础知识笔记一:

1.指针概念:一种特殊的数据类型,用来表示内存地址。
    指针就是内存地址,指针变量就是存储内存地址的变量。

2.声明指针变量:
    指针必须先声明后使用。指针变量名前必须放置指针运算符“*”
    数据类型 *指针变量名
eg.   int *p;    指针p的基类型是int。
    int* p;    int * p;三种写法都是一样的。
    声明多个同类型指针变量,每个指针变量都要加上指针运算符“*”
eg. int *p1,*p2;

3.空指针NULL用来表示指针不指向任何变量:
eg.    int *p=NULL;
    表示指针不指向任何整型变量,NULL可以赋值给任何类型的指针

4.(1)指针不能赋予整数
  (2)指针不能赋予整型变量的值
  (3)指针浮点型变量的指针不能指向整型变量
    (4)不同类型的指针之间不能相互赋值

eg.以下写法都是错误的:

int x,y,*p1,*p2;

double *d;

(1)p1=100;

(2)p2=y;

(3)d=&x;

(4)d=p1;

5.int *p=&x;
    指针p指向变量x,*p就是变量x的别名,*p和x拥有相同的值,改变*p也就改变了x的值,反之亦然。

6.“&”和“*”互为逆运算            x等价于*&x

基础知识笔记二:

1.指向指针的指针:数据类型  **指针变量名
    指针运算符*是右结合的,"*指针变量名"表示的是一个指针变量,"**指针变量名"表示该指针变量指向另一个指针变量
eg.    int x=88;
    int *p=&x
    int **pp=&p;

    声明了整型变量x,然后声明了指针变量p指向变量x,也就是p的值指向变量x的内存地址;
    最后声明了指针变量pp指向指针变量p,也就是pp的值是指针变量p的内存地址,pp是指向指针的指针。

2.通用指针:void
    不同类型的指针变量之间不能直接赋值,必须使用强制类型上转换。
eg.    int *pInt;
    double *pDouble;
    ...
    pInt=pDouble;错误!!!
    pInt=(int *)pDouble;正确

3.使用const修饰指针:由const的位置决定谁为常量。
(1)const在指针运算符“*”的左边:
    eg.    int x=126,y=163;
        const int *pInt=&x;
    或者   int const *pInt=&x;

    不能通过指针pInt来修改x的值,但可以修改指针pInt本身的值,使其指向其他变量。
    *pInt=88;错误
    pInt=&y;正确

(2)const在指针运算符“*”的右边:
    eg.    int *const pInt = &x;
    pInt所指向的变量的值是可以修改的,能够通过指针pInt来修改变量x的值,但指针pInt本身的值是常量,不能使其指向其他变量
    *pInt=88;正确
    pInt=&y;错误

(3)const在指针左右边
    eg.    const int *const pInt = &x;
    既修饰指针所指向的变量也修饰指针本身,两处都不能修改
    *pInt=88;错误
    pInt=&y;错误

下面用代码来帮助大家进一步理解指针的使用:

1.演示指针变量:

#include <stdio.h>
int main(){
	int x=88;
	int *p=&x;
	printf("变量x的值(x):%dn",x);
	printf("变量x的内存地址(&x):%#pn",&x);
	printf("指针变量p的值(p):%#pn",p);
	printf("指针变量p指向的内存空间中所存放的值(*p):%dn",*p);
	printf("变量x的值(*&x):%dn",*&x);
	return 0;
}

 不同的计算机运行上面的程序内存地址可能不同。

刚开始学习指针的同学可能会感到混乱,根据上面的输出结果,可以清晰地比较x,&x,p,*p,*&x的含义,加深理解。

        指向指针的指针:指针可以指向基本数据类型的变量,也可以指向指针变量。当指针指向指针变量时,称为指向指针的指针,也称为多级指针。(上面笔记二第一点有提到相关要点)

2.演示指向指针的指针:

/*eg.指向指针的指针*/
#include <stdio.h>
int main(){
	int x=88;
	int *p=&x;
	int **pp=&p;
	printf("变量x的值(x):%dn",x);
	printf("变量x的内存地址(&x):%#pn",&x);
	printf("指针变量p的值(p):%#pn",p);
	printf("指针变量p指向的内存空间中所存放的值(*p):%dn",p);
	printf("变量指针p的内存地址(&p):%#pn",&p);
	printf("指针变量pp的值(pp):%#pn",*pp);
	printf("指针变量pp指向的储存单元中所存放的值(*pp):%#pn",*pp);
	printf("变量x的值(**pp):%dn",**pp);
	return 0;
} 


//				%#p说明:p表示按十六进制格式输出指针(内存地址),#表示带有前缀OX 

 

在不同的计算机、操作系统和编译器上运行上面的程序,输出的内存地址可能不同。

程序第4行声明了整型变量x,其初始值为88。

程序第5行声明了指针变量p,其初始值为变量x的内存地址,这样指针变量p指向变量x。

程序第6行声明了指针变量pp,其初始值为指针变量p的内存地址,这样指针变量pp指向指针变量p。
程序第7行输出变量x中存放的值88。

程序第8行输出变量x的内存地址。
程序第9行输出指针变量p中存放的值,也就是变量x的内存地址,所以p与&x的值是相同的。

程序第10行输出指针变量p指向的内存空间所存放的值,也就是变量x中存放的值、所以*p与x的值是相同的。

程序第11行输出指针变量p的内存地址。
程序第12行输出指针变量pp中存放的值,也就是指针变量(p的内存地址所以pp与&p的值是相同的。

程序第13行输出指针变量pp指向的内存空间所存放的值,也就是指针变量p中存放的值,所以*pp与p的值是相同的。

程序第14行输出变量x中存放的值,所以**p与x的值是相同的。 

3.演示指针赋值和值赋值:

/*eg.演示指针赋值和值赋值*/
#include <stdio.h>
int main(){
	int x,y;
	int *p1,*p2;
	x=-42;
	y=163;
	p1=&x;
	p2=&y;
	printf("x=%d,*p1=%dn",x,*p1);
	printf("y=%d,*p2=%dn",y,*p2);
	*p1=*p2;
	printf("x=%d,*p1=%dn",x,*p1);
	printf("y=%d,*p2=%dn",y,*p2);
	*p2=126;
	p1=p2;
	printf("x=%d,*p1=%dn",x,*p1);
	printf("y=%d,*p2=%dn",y,*p2);
	return 0;
} 

理解好上面的指针赋值 ,对指针的理解会有很大帮助。

程序第4行声明了整型变量x和y。

程序第5行声明了整型指针pl和p2。
程序第6、7行分别置x和y的初始值为-42和163;

程序第8、9行分别置pl和p2的初始值为x和y的内存地址(&x和&y),这样指针p1指向变量x,指针p2指向变量y。
程序第10行输出变量x的值和指针pl所指向的变量的值,它们应该是一样的。

程序第11行输出变量y的值和指针p2所指向的变量的值,它们也应该是一样的。

程序第12行是值赋值,把指针p2所指向的变量的值,也就是变量y的值163,赋值给指针p1所指向的变量中,也就是x中,这样x、y中的值以及指针p1、p2所指向的变量的值都为163,这可以从第13、14行的输出结果得到验证。
程序第15行将指针p2所指向的变量的值,也就是变量y的值修改为126,现在x的值为163,y的值为126。
程序第16行是指针赋值,指针p1、p2都指向同一个变量y,这样p1、p2所指向的变量的值都为126,也就是变量y的值,而变量x中存放的值仍为163,这可以从第17、18行的输出结果得到验证。

指针笔记(下)加快更新......

希望对大家有帮助!