指针(二)

指针
1、定义
基类型 * 指针变量名
2、赋值
int a; int *pa=&a,*pa=&a int *p2=&a

两个运算符
&取地址,后面操作必须是变量
*指针运算符,后面的操作必须是指针。

int a=3;
int *pa=&a;
&a 正确,表示a的地址
&pa 正确,表示pa的地址
*a 不对
*pa 正确,表示的是pa指向的变量,即a
*&a 正确, 表示的就是a
*&pa 正确,表示的是pa
&*a 不对
&*pa 正确,表示的是pa,即&a,
& * 如果正确使用,则两个运算符可以相互抵消

通过指针引用数组:
所谓的数组元素的指针就是数组元素的地址
通过下标遍历数组元素
int a[]={1,2,3.4,5,6};
a 表示的是数组首元素的地址,是一个常量,不能改变,等价于&a[0];
p=&a[0]等价于p=a;
在一定条件允许下对指针进行加和减的运算。
当指针指向数组元素的时候,比如,指针变量p指向数组元素a[0],我们希望p+1表示a[1]。在指针已经指向一个数组元素的时候,可以进行加一个整数,可以减一个整数,自加运算,自减运算。

int *pa=a; 指针变量pa指向数组首地址
int *pa=&a[0];

如果指针变量指向数组首地址,此时指针变量可以使用下标,即指针变量等同于数组名。
当指针变量指向数组的时候,指针变量的加减运算才有意义。
当指针变量pa指向数组a的首地址,且pa的值不能改变,一致指向数组的首地址,i表示下标
pa+i<== > &a[i] <>&pa[i]<>a+i 表示数组元素的地址
(pa+i)《=》a[i]《=》pa[i]《===》(a+i) 表示的是数组元素

### C语言中数组指针指针的区别 #### 数组指针的概念及其特性 在C语言里,数组指针是一种特殊的指针变量,它存储的是整个数组的地址而非单个元素。当声明一个指向特定类型的数组指针时,该指针可以用来访问连续内存区域内的多个相同类型的数据项。例如,`int (*p)[N];` 表明 `p` 是一个指向含有 N 个整数的数组指针。 对于数组指针而言,其主要特点在于能够直接操作多维数组或动态分配的一维或多维数组,并且可以通过简单的算术运算来遍历这些结构[^1]。 ```c #include <stdio.h> void printArray(int (*arrPtr)[3], int rows){ for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ",(*arrPtr)[j]); arrPtr++; putchar('\n'); } } int main(){ int matrix[][3]={ {1,2,3}, {4,5,6} }; printArray((int(*)[3])matrix,sizeof(matrix)/sizeof(matrix[0])); return 0; } ``` #### 指针的理解及应用场景 另一方面,所谓“指针”,指的是指向另一个指针对象的指针。这意味着如果有一个普通的指针 p,则 *p 将返回所指向的对象;而如果有指针 pp,则 **pp 才会得到最终的目标值。这种机制允许程序间接地修改传递给函数的实际参数,尤其是在处理可变长度列表或者链表等复杂数据结构的时候非常有用[^2]。 下面是一个关于如何利用指针交换两个整数值的例子: ```c #include <stdio.h> // 函数用于通过指针交换两数 void swapInts(int **a, int **b){ int temp = **a; **a = **b; **b = temp; } int main() { int firstNumber = 10; int secondNumber = 20; // 创建指向各自数字的指针并进一步创建它们各自的指针 int *ptrFirst=&firstNumber,*ptrSecond=&secondNumber; int **doublePtrFirst=&ptrFirst,**doublePtrSecond=&ptrSecond; printf("Before swapping:\na=%d\nb=%d\n",*ptrFirst,*ptrSecond); swapInts(doublePtrFirst,doublePtrSecond); printf("After swapping:\na=%d\nb=%d\n",*ptrFirst,*ptrSecond); return 0; } ``` 综上所述,在理解和运用这两种不同形式的指针时需要注意区分两者的作用范围以及适用场景。数组指针主要用于简化对固定尺寸数组的操作,而指针则提供了更灵活的方式来管理和改变指针本身的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值