初识指针——“C”

简介: 初识指针——“C”

指针的世界欢迎你!


什么是指针


变量的指针和指向变量的指针变量


        1.怎样定义指针变量


        2.在定义指针变量是的注意事项


        3.怎样引用指针变量


通过指针引用数组


        1.指向数组元素的指针


        2.指针的运算


        3.通过指针引用数组元素


字符串与指针


        1.字符串的指针


        2.字符串指针变量


        3.字符指针变量和字符数组比较


什么是指针


内存区的每一个字节都有一个编号。这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。


1.按变量地址存取变量值的方式称为“直接访问”方式。


2.另一种存取变量值的方式称为“间接访问”方式。即,将变量i的地址存放在另一个变量中。


    在C语言中,指针是一种特殊的变量,它是存放地址的。


指针和指针变量的定义:


一个变量的地址称为该变量的“指针”。


例如:地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(指针),则称为“指针变量”。


变量的指针和指向变量的指针变量


怎样定义指针变量


定义指针变量的一般形式为


          基类型    *指针变量名


下面都是合法的定义:


float  *pointer_1;


char  *pointer_2;


可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。


例如:


pointer_1=&i;


pointer_2=&j;


在定义指针变量时要注意两点:


(1)指针变量前面的“*”,表示该变量的类型为指针型变量。


例:float  *pointer_1;


指针变量名为pointer_1,而不是*pointer_1。


(2)在定义指针变量时必须指定基类型。


需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。


下面的赋值语句是错误的:


     float a;


     int  *pointer_1;


     pointer_1=&a;


怎样引用指针变量


注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。


对“&”和“*”运算符说明:


(1)& 取地址运算符


        &a表示变量a所占据的内存空间的首地址。


(2)* 指针运算符


       *p表示指针变量p所指向的内存中的数据。


指针变量的引用:通过指针变量访问所指变量。


1.将指针变量指向被访问的变量。


例:int a=5,*p,b;


       p=&a;


2.访问所指变量


取内容:b=*p;


              printf("%d\n",*p);


存内容:*p=100;


注意:*p若出现在“=”的右边或其他表达式中则为取内容,*p若出现在“=”的左边则为存内容。

image.png

通过指针引用数组


一个变量有地址,一个数组包含若干元素。


每个数组元素都在内存中占用存储单元,它们都有相应的地址。


指针变量既然可以指向变量,当然也可以指向数组元素(把某一个元素的地址放到指针变量中)。所谓数组元素的指针就是数组元素的地址。


指向数组元素的指针


定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。


例如:int a[10];


         (定义a为包含10个整型数据的数组)


         int *p;


         (定义p为指向整型变量的指针变量)


应当注意,如果数组为int型,则指针变量的基类型应为int型。


对该指针变量赋值:


p=&a[0];


把a[0]元素的地址赋给指针变量p。也就是使p指向a数组的第0号元素。


指针的运算


C语言规定在指针指向数组元素时,可以对指针进行以下运算:


1.加一个整数(用+或+=),如p+1;


2.减一个整数(用-或-=),如p-1;


3.自加运算,如p++,++p;


4.自减运算,如p--,--p;


5.两个指针相减,如p1-p2(只有p1和p2都指向同一个数组中的元素时才有意义)


说明:


(1)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。


(2)如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d(是一个数组元素所占的字节数),这样p就指向数组的下一个元素a[1]。


(3)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组的第i+1个元素。


(4)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。


(5)如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度。两个地址不能相加。


通过指针引用数组元素


引用一个数组元素,可以用:


     (1)下标法,如a[i]形式;


     (2)指针法,如*(a+i)或*(p+i)。其中a是数组名。p是指向数组元素的指针变量。其初值p=a。


例:输出数组中的全部元素。


假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:

image.png

image.png

image.png

字符串与指针


字符串的指针


C语言的字符串是以’\0’作结束符的字符序列。


用字符数组存放字符串(即含’\0’的字符数组可以看作字符串)。


字符串指针就是字符数组的首地址。


例:char a[]=“Apple”;


      char b[]={’c’,’h’,’i’,’n’,’a’,’\0’};


字符串指针变量


定义:char *指针变量


例:char  *p,*q=“Language”;


      p=“This is a book”;


例:char *p,c[10];


      p=c;


字符指针变量和字符数组比较:


char a[]=“I love this game”,*p=a;


1.存储的内容不同:


字符数组可以存字符串,存的是字符;


字符指针变量存的是字符串在内存中的首地址。


2.赋值方法不同:


字符数组只能对各个元素赋值;(一次只赋一个字符,要赋若干次)


字符指针变量只赋值一次,赋的是地址。


例:char a[10],*p;


       p=“China”;      正确


       a=“Hello”;       错误


3.当没有赋值时:


字符数组名代表了一个确切的地址;


字符指针变量中的地址是不确定的。


例:char a[10],*p;


      scanf("%s",a);       正确


      scanf("%s",p);       错误


4.字符数组名不是变量,不能改变值;


  字符指针变量可以改变值。


5.可以像数组那样用下标形式引用指针变量所指字符串中的字符。


6.字符串指针变量的应用:


  可以用指针变量指向一个格式字符串,在printf中直接使用此指针变量。


相关文章
|
30天前
|
存储 程序员 C++
c++指针
c++指针
22 1
|
1月前
|
C++ 编译器
|
8月前
|
程序员 C语言
C 指针
C 指针。
25 0
|
1月前
|
程序员 C语言
C指针
C指针。
18 6
|
1月前
|
人工智能
## 对指针的理解
## 对指针的理解
13 0
|
1月前
|
存储 程序员
C指针详解
C指针详解。
19 0
|
1月前
指针(2)
指针(2)
15 0
|
1月前
|
存储
浅谈指针(1)
浅谈指针(1)
|
11月前
|
人工智能 程序员 C语言
C 中的指针
C 中的指针
|
11月前
|
人工智能
指针-田忌赛马
指针-田忌赛马