十、数组与指针
一维数组与指针
数组名称就是数组在内存中的首地址
若在定义一个指针变量,将数组首地址传给指针变量,则该指针就指向了该数组
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] | 1 | 2 | 3 | 4 | 5 |
&a[1] | 6 | 7 | 8 | 9 | 10 |
&a[2] | 11 | 12 | 13 | 14 | 15 |
字符串与指针
访问字符串两种方式
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
函数被调用了,但是它不能成功交换num1
和num2
的值的原因是因为函数参数传递的方式。以下是参数的传递方式:
- 按值传递:
- 在 C 和 C++ 中,函数参数默认是按值传递的。这意味着在调用函数时,实际参数(即传递给函数的参数,例如
num1
和num2
)的值被复制到函数的形式参数(即函数定义中的x
和y
)中。- 当你调用
swap(num1, num2);
时,实际上是将num1
和num2
的值 10 和 20 复制到了x
和y
中。- 函数内部交换:
- 在
swap
函数内部,使用了一个临时变量temp
来完成x
和y
的交换。但这只是在函数的局部范围内进行的交换操作,并不影响main
函数中num1
和num2
的值。- 局部变量:
- 变量
x
和y
是swap
函数内部的局部变量。它们的生命周期仅限于函数执行期间。当swap
函数执行完毕后,这些变量的值和存在的作用域都会被销毁。- 没有影响实际参数:
- 因为参数是按值传递的,所以
swap
函数中对x
和y
的交换操作并不会影响到main
函数中num1
和num2
的值。num1
仍然是 10,num2
仍然是 20。
如果想在
swap
函数中交换num1
和num2
的值,可以通过传递指针或者引用来实现。这样可以让函数修改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[])