数组-指针-引用

该博客主要围绕C语言展开,介绍了指针的赋值、运算,以及指针与数组的关系,包括一维和二维数组与指针的等价关系和使用示例。还将引用和指针进行比较,指出二者可达到同样效果。此外,详细说明了*和&符号在不同场景下的用途,避免使用混淆。

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

一、指针的概念

指针是内存中的地址。

1、语法:类型 * 变量名
这里的类型是定义了这个指针指向的变量类型。

2、指针的运算符(*和&)
<1>&取地址符
例如:
int counta=100;
int * mm;
mm=&counta;
假设counta所在地址是2000,这是候m=2000。
#include
void main()
{
int counta=100;
int * mm;
mm=&counta;
cout < }
<2>*返回这个地址的值,与&正好相反。
#include
void main()
{
int p,counta=100;
int * mm;
mm=&counta;
p=* mm;
cout <

}
3、指针的赋值

#include
void main()
{
int x;
int * p1,* p2;
p1=&x;
p2=p1;
cout < }

结果:0x0012FF7C
4、指针的运算
指针的++与--是将指针的地址移动所属变量类型位数。

char 8
int 16
long 32
float 32
double 64
5、指针与数组

数组声明:类型 变量名[长度]

没有下标的“一维”数组名就是一个指向该数组第一个元素的指针。

#include
void main()
{
int x[3]={1,2,3};
int * p1;
p1=x;
cout < }
a、等价关系:

如:char c[10];
c 和 &c[0] 是等价的。

再如:char c[2][3];
c 和 &c[0][0] 是等价的。
*(c+12) 和 &c[1][2] 是等价的。

b、数组与指针的关系

1>一维数组的指针

#include
void main()
{
int x[2]={1,2};
int * p1;
p1=x;
cout <<* p1<<"/n";
cout <<* (p1+1)<<"/n";
}

2>二维数组的指针

#include
void main()
{
int
x[2][3]={1,2,3,4,5,6};
//int x[2]={1,2};
int * p1;
p1=&x[0][0]; //二维数组给指针不能用"p1=x"这个来赋值,只能是“p1=x[2]”
cout < cout < cout < cout < cout < cout < cout <<* p1<<"/n";
cout <<* (p1+1)<<"/n";
cout <<* (p1+2)<<"/n";
cout <<* (p1+3)<<"/n";
cout <<* (p1+4)<<"/n";
cout <<* (p1+5)<<"/n";
//规律:* (p1+((1*3)+2))
}

思考:指针是地址,那么如果想得到某地址的变量用什么方法。

二、将引用和指针相比较

引用是变量的别名。

#include
void main()
{
int * p1,a=100;
int & y1=a; //必须直接赋值
p1=&a;
y1=a;
cout <<* p1<<"/n";
cout < }

指针和引用可以达到同样的效果。

#include
void main()
{
void funca(int & vala);
void funcp(int * valp);
int a=100,b=100;
int & y1=a; //必须直接赋值,而且只能赋值一次
funca(a);
funcp(&b);
cout < cout < }
void funca(int & vala)
{
vala=200;
}
void funcp(int * valp)
{
* valp=500;
}

三、*和&的用途,避免这些符号在使用上发生混淆

1、*的作用:

1>乘号
2>指针定义符号
3>返回某个地址的值

2、&的作用:

1>位运算中的“与”
2>取地址符
3>引用

### 如何使用指针操作数组 #### 示例代码 以下是通过指针操作数组的一个简单示例: ```c #include <stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50}; // 定义一个整型数组 int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 int *ptr = arr; // 使用指针指向数组的第一个元素 for (int i = 0; i < n; i++) { printf("Element at index %d is %d\n", i, *(ptr + i)); // 输出数组的每个元素 } return 0; } ``` #### 语法解释 上述代码展示了如何利用指针访问和操作数组。具体说明如下: - `int arr[]` 是一个包含五个整数的数组[^1]。 - `sizeof(arr)` 返回整个数组占用的字节数,而 `sizeof(arr[0])` 则返回单个元素所占的字节数。两者的商即为数组的实际长度[^2]。 - `int *ptr = arr;` 表示将指针变量 `ptr` 初始化为数组 `arr` 的起始地址。此时,`ptr` 实际上等价于 `&arr[0]`[^3]。 - `(ptr + i)` 表达式表示基于指针偏移量计算第 `i` 个元素的位置。由于 C 中的指针运算自动考虑数据类型的大小,因此无需手动乘以每项的字节宽度[^4]。 #### 动态分配二维数组的例子 如果需要创建动态二维数组,则可以通过以下方法实现: ```c #include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 动态分配二维数组 int (*arr)[cols] = malloc(rows * sizeof(*arr)); if (arr != NULL) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { arr[i][j] = i * cols + j + 1; // 给数组赋值 } } // 打印二维数组的内容 for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { printf("%d ", arr[i][j]); } printf("\n"); } free(arr); // 释放内存 } else { printf("Memory allocation failed.\n"); } return 0; } ``` 此程序演示了如何声明并初始化一个具有指定行列数的二维数组,并对其执行读写操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值