c语言与指针——(二)指针变量的定义与赋值

本文详细介绍了C语言中指针的基本概念,包括指针变量的定义、取地址运算符和取值运算符的使用方法,并通过实例展示了如何利用指针访问变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        由上一节,我们知道了,指针就是地址,而变量的指针就是变量的地址,存放变量地址的变量就是指针变量。指针变量可以指向另一个变量,在程序中使用" * "来表示这种指向关系。

1.指针变量的定义

        指针的定义依然遵循先定义后使用的原则,在使用前必须先定义,指定其类型编译器再据此为其分配内存单元。

        定义指针变量的一般格式:

        类型标识符 * 指针变量名

        例如:int   *p ;    float   *p;   分别是指向整形变量的指针变量p,指向浮点类型变量的指针变量q。

注意:定义指针变量时,类型标识符一旦确定就不能改变,如果定义了一个指向整型变量的指针变量,那么它就不能再指向其他类型的变量了。也就是说一个指针变量只能指向同一种类型的变量。

2.取地址运算符(&)

        为了使用指针,c语言提供了两个特别的运算符——取地址运算符&和取值运算符*。

        在定义了一个指针变量后,只为其分配了相应的内存单元用于存放指针的值,而这个指针变量并没有指向某个特定的变量,因此,在使用指针时,也需要将指针变量进行初始化,因为指针变量存放的是变量的地址,因此对指针初始化就是将某个变量的地址赋给它。

例如: 

int  x=5,*p;   p=&x;   (将x的地址赋给了指针变量p,那么指针变量p就指向了x)

        程序中定义的变量和存储器中的存储单元相对应,变量名字和存储单元的地址对应,变量内容和存储单元中所存储的数据对应。

当然上述语句也可以写成  :

int x=5;
int *p=&x;
还可以写成:

int x=5,*p=&x;
        使用c语言编程时,每个变量都有变量名,还有变量存储的值。当程序被编译和加载后,变量名就变成了计算机内存中的地址,而变量的值就存放在该地址中或从该地址开始的连续几个内存单元中。因此,变量名和变量值实际上就是变量地址和地址中存放的值。

3.取值运算符(*)

        如果指针变量指向了某个变量,那么就可以使用取值运算符*来访问变量中的内容。

例如

printf("%d\n",*p);
        如果指针变量p指向整形变量x,那么就可以用下面的语句打印变量x的值。

4.指针变量的赋值

        和其他变量一样,也可以使用赋值运算符为指针变量赋值,但要保证两个指针变量的类型相同。

假设有如下变量定义:

int i,j,*p,*q;
p=&i;
q=&j;
        这两句将变量i和j的地址分别赋值给指针变量p和q;

        当q=p时,这条语句就是将指针变量p的内容赋值给指针变量q,其结果如下图所示:

        执行了q=p后,执行该条语句,指针变量p和q都指向了同一个变量i,因此指针变量p和q中存放的都是变量i的地址&i。变量i此时并没有初始化,只为其分配了内存单元。

注意理解:q=p;和*q=*p

        前者为指针变量q赋值,即将指针变量p中存放的某个变量的地址赋值给q。显然,赋值后,q和p就指向了同一个变量。(赋值的内容是指针,也就是地址)  

        后者将p指向变量的赋值给q指向的变量。(赋值的内容是数值)

例子:

p=&i;
q=&j;
i=2;
j=3;
对上面代码分别执行q=p;*q=*p;流程图如下图:



5.例子讲解

通过指针变量访问整形变量

#include <stdio.h>
int main(){
    int a=100,b=10;
    int *pointer_1,*pointer_2;
    pointer_1=&a;
    pointer_2=&b;
    printf("a=%d,b=%d\n",a,b);
    printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); 
    return 0;
}
a=100,b=10
*pointer_1=100,*pointer_2=10

程序分析:

(1)在开头处定义两个指针变量*pointer_1,*pointer_2。但此时它们并未指向任何一个变量,只是提供两个指针变量,规定它们可以指向整形变量,至于指向那个整形变量,要在程序中定义,程序中pointer_1指向a,pointer_2指向b,此时pointer_1的值就是&a,pointer_2的值就是&b。

(2)第8行输出*pointer_1,*pointer_2的值,其中*是取值符号,表示“指向变量”。所以它们的值分别就是a,b变量的值。

(3)程序中有两处*pointer_1,*pointer_2,第四行表示定义两个指针*pointer_1,*pointer_2,“*”只是表示该变量是个指针变量。最后一行的printf函数中*pointer_1,*pointer_2代表指针变量*pointer_1,*pointer_2所指向的变量。



### 指针赋值的用法和规则 在C语言中,指针变量用于存储地址。为了正确地给指针变量赋值,需要遵循特定的规则和注意事项。以下是关于指针赋值的详细说明: #### 1. 指针变量的基本赋值 指针变量可以被赋予一个地址值。这种地址值通常来自另一个变量的地址或字符串常量的首地址[^1]。例如: ```c char *pc; pc = "C Language"; // 将字符串常量的首地址赋值指针变量 pc。 ``` 这里需要注意的是,`pc` 并不是存储了整个字符串,而是存储了字符串常量的首地址[^1]。 #### 2. 指针变量初始化赋值定义指针变量时,可以直接对其进行初始化赋值。例如: ```c char *pc = "C Language"; // 初始化赋值为字符串常量的首地址。 ``` 这种方式是将字符串常量的首地址直接赋值指针变量 `pc`[^1]。 #### 3. 指针变量之间的赋值 指针变量之间也可以互相赋值,但前提是它们的类型必须一致(或兼容)。例如: ```c double d = 4.5; double *pd = &d; // pd 被赋予变量 d 的地址。 double *pd2 = pd; // pd2 被赋予 pd 的值(即 d 的地址)。 ``` 这里,`pd2` 和 `pd` 都指向同一个变量 `d` 的地址[^4]。 #### 4. 指针数组的关系 指针变量可以指向数组中的元素。通过指针操作数组元素时,可以使用指针算术来访问不同的元素。例如: ```c int a[5] = {12, 14, 20, 18, 50}; int *p = a; // p 被赋予数组 a 的首地址。 printf("%d\n", *p); // 输出数组第一个元素的值。 p++; // p 移动到下一个元素的地址。 printf("%d\n", *p); // 输出数组第个元素的值。 ``` 在这个例子中,`p` 是一个指向整型的指针变量,它被赋予数组 `a` 的首地址,并通过指针算术访问数组的不同元素[^3]。 #### 5. 指针赋值的注意事项 - **类型匹配**:指针变量只能被赋予其类型兼容的地址值。如果需要赋值不同类型的地址,必须进行强制类型转换。例如: ```c int i = 10; void *pv = &i; // 使用 void* 类型指针可以指向任何类型的变量。 int *pi = (int *)pv; // 强制类型转换为 int*。 ``` - **避免悬空指针**:指针变量在未被赋予有效地址之前不应被解引用。例如: ```c int *p; // 未初始化的指针。 printf("%d\n", *p); // 错误:p 没有指向有效的地址。 ``` - **字符串常量的不可修改性**:当指针指向字符串常量时,不能通过指针修改字符串内容。例如: ```c char *pc = "C Language"; pc[0] = 'c'; // 错误:尝试修改字符串常量的内容。 ``` #### 示例代码 以下是一个综合示例,展示指针赋值的各种用法: ```c #include <stdio.h> int main() { int a = 10; int b = 20; int *p1 = &a; // p1 被赋予变量 a 的地址。 int *p2 = &b; // p2 被赋予变量 b 的地址。 printf("Value of a: %d\n", *p1); // 输出 a 的值。 printf("Value of b: %d\n", *p2); // 输出 b 的值。 p1 = p2; // p1 被赋予 p2 的值(即 b 的地址)。 printf("Value pointed by p1 after reassignment: %d\n", *p1); // 输出 b 的值。 return 0; } ``` ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值