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

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

int main(){

int x=88;

int *p=&x;

printf("变量x的值(x):%d\n",x);

printf("变量x的内存地址(&x):%#p\n",&x);

printf("指针变量p的值(p):%#p\n",p);

printf("指针变量p指向的内存空间中所存放的值(*p):%d\n",*p);

printf("变量x的值(*&x):%d\n",*&x);

return 0;

}

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

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

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

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

/*eg.指向指针的指针*/

#include

int main(){

int x=88;

int *p=&x;

int **pp=&p;

printf("变量x的值(x):%d\n",x);

printf("变量x的内存地址(&x):%#p\n",&x);

printf("指针变量p的值(p):%#p\n",p);

printf("指针变量p指向的内存空间中所存放的值(*p):%d\n",p);

printf("变量指针p的内存地址(&p):%#p\n",&p);

printf("指针变量pp的值(pp):%#p\n",*pp);

printf("指针变量pp指向的储存单元中所存放的值(*pp):%#p\n",*pp);

printf("变量x的值(**pp):%d\n",**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

int main(){

int x,y;

int *p1,*p2;

x=-42;

y=163;

p1=&x;

p2=&y;

printf("x=%d,*p1=%d\n",x,*p1);

printf("y=%d,*p2=%d\n",y,*p2);

*p1=*p2;

printf("x=%d,*p1=%d\n",x,*p1);

printf("y=%d,*p2=%d\n",y,*p2);

*p2=126;

p1=p2;

printf("x=%d,*p1=%d\n",x,*p1);

printf("y=%d,*p2=%d\n",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行的输出结果得到验证。

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

希望对大家有帮助!

相关推荐

28365365备用网址 如何打出(M²)平方米符号

如何打出(M²)平方米符号

📅 07-12 👁️ 5317
365体育投注网 篆刻印文排列

篆刻印文排列

📅 07-20 👁️ 8023