指针

简介: 一、指针与指针变量二、取址运算符和取值运算符

指针  

 

内容介绍:

一、指针与指针变量

二、取址运算符和取值运算符

 

 

一、 指针与指针变量

1、指针是c语言的精髓部分,没有指针就没有现在简洁紧凑高效的c语言,作为学习者,对指针的掌握程度直接决定对C语言的编程能力。

 

2、定义指针变量

1)、如果在程序中定义一个变量,那么在程序进行编译的时候,就会根据这个变量的类型在系统中分配对应的长度的空间,通过变量名来访问变量。

 

2)、通过变量名来访问内存是一个相对较安全的方式,只有定义了变量,才能访问它,这是对内存最基本的认知。

类型名*指针变量

 

char *pa; //定义一个指向字符型的指针变量

int *pb; //定义一个指向整型的指针变量

 

要注意不同类型所占空间大小不同,如果指定错误,那么访问时就会出错

 

指针就是地址的意思,指针变量是存放一个地址,普通变量就是存放一点数据,指针的类型就是存放数据的类型

 

编译器知道每个地址存放的值,一个地址4个字节,在内存中的值是一个地址

地址称之为指针,而这个存放的值称之为指针变量

 

数据在内存中如何存取

image.png

在程序中定义一个变量,程序编译时,系统就会根据编译类型在

程序内存中分配对应强度的空间,通过变量名进行访问

 

内存存储数据:

image.png

 

内存索引单元最小是一个字节,可以想象成一个大型数组,数组有索引下标,内存中称为地址

 

4个存储单元存储一个整型变量,每个存储单元有一个地址,整形变量就相当于4个字节,变量名是根据程序员的使用而定义的,这就是内存存储数据的真相

 

只有编译器知道:

a -> 10000

b -> 10001

c -> 10002

d -> 10003

e -> 10004

f-> 10005

g ->10009

想要f的值,就去读取f的地址10005

 

 

二、 取址运算符和取值运算符

如果需要获取某个变量的地址,可以使用取地址运算符((&):

char *pa= &a;

int *pb = &f;

*pa=3,称之为间接访问,

 

如果需要访问指针变量指向的数据,可以使用取值运算符(*:

直接通过变量来访问,称为直接访问,例如:a=3,就可以直接访问a的值。

printf("%c, %d\n", *pa,*pb);

 

案例:

#include <stdio.h>

int main()

{

//定义两个普通变量

char a ='F';

int f =123;

//定义两个指针变量,*代表指针变量

char *pa = &a;//其中地址类型为char类型

int *pb = &f ;//f指向整型

//pa的值,pa为指针名字

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

 

return 0;

 

}

 

运行gcc test.c && ./a.out

结果:

a = F

F = 123

 

间接访问案例:

#include <stdio.h>

int main()

{

char a ='F';

int f =123;

char *pa = &a;

int *pb = &f ;

//pa的值,*

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

 

//通过指针间接访问

*pa = 'c';

pb +=1;

 

printf("now, a = %c\n", pa) ;

printf("now, f = %d\n",*pb);

return 0;

}

 

运行gcc test.c && ./a.out

结果:

a = F

F = 123

now,a=C

now,f=124

这就是间接访问

 

sizeof案例:

#include <stdio.h>

int main()

{

char a ='F';

int f =123;

char *pa = &a;

int *pb = &f ;

//pa的值,*

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

//通过指针间接访问

*pa = 'c';

pb +=1;

//打印*pa为地址存放的值

printf("now, a = %c\n", *pa) ;

printf("now, f = %d\n",*pb);

printf( "sizeof pa =%d\n"", sizeof( pa));

printf("sizeof pb =%d \n", sizeof ( pb ) ) ;

printf( "the addr of a is : %p\n", pa) ;

printf ("the addr of b is : %p\n", pb) ;

 

return 0;

}

 

运行gcc test.c && ./a.out

结果:

a = F

F = 123

now,a=C

now,f=124

sizeof pa

sizeof pb

the addr of a is :0xbf9eff17

the addr of b is :0xbf9eff10

0x开头占16个字节

 

注意:避免访问未初始化的指针

这就是未初始化的指针

#include <stdio.h>

int main( )

{

//定义的一个整型指针,但是并没有分配值,内存就是随机的值

int *a;

//程序终止并且报错

*a = 123;

return 0;

}

这种类似的问题是很难排查的。因为从语法上是正确的,但是这个代码又会得到意想不到的结果,所以必须确保他们被初始化了。

下图这种 就是错误的。

image.png

相关文章
|
4月前
|
C语言 C++
深入理解指针
深入理解指针
59 2
|
4月前
|
存储 程序员 C++
c++指针
c++指针
31 0
|
11月前
|
存储 人工智能 编译器
c中的指针详解
c中的指针详解
|
1月前
|
存储 C++
一篇文章带你深入了解“指针”(下)
一篇文章带你深入了解“指针”(下)
|
3月前
|
存储 编译器 C++
C++中的指针
C++中的指针
23 1
|
11月前
|
程序员 C语言
C 指针
C 指针。
37 0
|
4月前
|
存储 C语言
c 指针
c 指针
37 0
C++ 指针篇
指针大小:32位操作系统中指针占4个字节; 64位操作系统中指针占8个字节
134 0
|
C++
指针——C++的灵魂
指针——C++的灵魂
214 0
指针——C++的灵魂
|
机器学习/深度学习 存储 C语言
06.C(指针)
(创建于2017/8/17) 指针的含义 #include int main() { int a = 10; int *p = &a; //这行代码等同于 int *p; p = &a; //int *p; /...
1083 0