C语言(数组与指针)

十、数组与指针

一维数组与指针

数组名称就是数组在内存中的首地址

若在定义一个指针变量,将数组首地址传给指针变量,则该指针就指向了该数组

int *p,a[10];
p=a;/*数组名a,就是数组的首地址,将地址赋给指针变量p没啥问题吧*/
p=&a[0];/*数组a的首个元素的地址赋值给p,没啥问题吧*/

p+n与a+n表示数组元素a[0+n]的地址,即&a[n]
对于a[10]来说,有10个元素,n取值为0~9,则数组元素的地址有表示为p+0~p+9,或者a+0~a+9
  
*(p+n)*(a+n)就是取对应后移地址的值

二维数组与指针

简单定义个3行五列吧

首地址&a[0][0]

&a[m][n]表示第m行第n列地址

a[0]+n表示第0行第n个元素地址

*(a+i)等价于*a[i]

&a[0][0]
a[0]+0
&a[0][1]
a[0]+1
&a[0][2]
a[0]+2
&a[0][3]
a[0]+3
&a[0][4]
a[0]+4
&a[0]12345
&a[1]678910
&a[2]1112131415

字符串与指针

访问字符串两种方式

1、使用字符数组来存放一个字符串,从而实现对字符串的操作

2、使用字符指针指向一个字符串,可以不用定义数组

char *string = "adasdasdadad"

字符串数组

字符串数组是以字符串作为数组元素的数组,可以看作为二维数组

char arr[5][20]={
	"china",
	"japan",
	"germany",
	"russia",
	"switzerland"
}

字符串要考虑"\0",可别越界了。

指针数组,可以解决资源浪费问题。每个指针指向所需的字符常量

指针数组中的每一个元素都相当于一个指针变量

类型名 *数组名[数组长度]

指向指针的指针

类型标识符 **指针变量名

例如:int **p等同于int *(*p)

注:*是自右向左结合的

含义:定义一个指针变量p,指向另一个指针变量,该指针变量又指向一个基本数据类型变量

int x = 10;
int *px = &x;  // 指向整型变量 x 的指针
int **p = &px; // 指向指针 px 的指针

int **p = NULL; 可以将 p 初始化为空指针。

指针变量作为函数参数

观察两个代码

#include <stdio.h>

void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	swap(num1, num2);
	printf("num1 = %d\nnum2 = %d", num1,num2);
	return 0;
}
执行结果:
num1 = 10
num2 = 20

虽然 swap 函数被调用了,但是它不能成功交换 num1num2 的值的原因是因为函数参数传递的方式。

以下是参数的传递方式:

  1. 按值传递:
    • 在 C 和 C++ 中,函数参数默认是按值传递的。这意味着在调用函数时,实际参数(即传递给函数的参数,例如 num1num2)的值被复制到函数的形式参数(即函数定义中的 xy)中。
    • 当你调用 swap(num1, num2); 时,实际上是将 num1num2 的值 10 和 20 复制到了 xy 中。
  2. 函数内部交换:
    • swap 函数内部,使用了一个临时变量 temp 来完成 xy 的交换。但这只是在函数的局部范围内进行的交换操作,并不影响 main 函数中 num1num2 的值。
  3. 局部变量:
    • 变量 xyswap 函数内部的局部变量。它们的生命周期仅限于函数执行期间。当 swap 函数执行完毕后,这些变量的值和存在的作用域都会被销毁。
  4. 没有影响实际参数:
    • 因为参数是按值传递的,所以 swap 函数中对 xy 的交换操作并不会影响到 main 函数中 num1num2 的值。num1 仍然是 10,num2 仍然是 20。

如果想在 swap 函数中交换 num1num2 的值,可以通过传递指针或者引用来实现。这样可以让函数修改 main 函数中的变量值,而不是仅仅在函数内部交换。

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int num1 = 10;
    int num2 = 20;
    swap(&num1, &num2);
    printf("num1 = %d\nnum2 = %d", num1, num2);
    return 0;
}
执行结果:
num1 = 20
num2 = 10

实参变量和形参变量之间的数据传递是单向的"值传递"方式

指针变量作为函数参数也是如此

调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值

返回指针值的函数

类型名 *函数名(参数列表)

一个函数在编译时被分配一个入口地址,该入口地址就称为函数的指针。可以用一个指针变量指向函数,任何通过该指针变量调用函数

int *fun(int x,int y)

指针数组做为main()函数的参数

main函数带参数形式

main(int argc,char *argv[])
  • 43
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值