day11-c数组与指针

day11-c数组与指针

一、复习

1、数组

​ 字符数组和字符串

​ 字符数组:存放的数据是字符数据

​ 字符串:由一个或者多个字符组成,在字符串的末尾有一个隐藏的空字符 – ‘\0’

​ char a[50] = “hello”;

2.字符串函数:

字符串长度函数 – strlen()
字符串连接函数– strcat()
字符串拷贝函数 – strcpy()
字符串比较函数– strcmp()

注:int a[10]={0}相当于把数组a中的所有元素给赋值成’\0’,但是int a[arr]={0}则错误,因为在数组长度为变量时不能同时进行赋值
同时也不能把字符串常量赋值给一个字符数组,因为字符数组本身也是个常量 char s[10];s=”abcdefg”是错误的。




二、指针

1、指针相关运算符

1
2
3
4
5
6
&:获取内容的地址
int a = 2;
&a --> 获取到a的地址

*:获取地址中的内容
*(&a) == a == 2;

2、指针变量

​ 指针变量就是用于存放地址

1
2
3
4
5
<存储类型> <数据类型> *指针变量名;
int a = 2;
int *p = &a; //将a的地址存放在了一个名为p的指针变量中
p == &a;
*p = *(&a) == a == 2

3、指针变量的赋值

赋值运算符的左值和右值类型一定要相同

(1)将一个变量的地址赋值给一个具有相同数据类型的指针变量

1
2
int a = 10;
int *p = &a;

(2)将一个已有的指针赋值给一个 具有相同数据类型的指针变量

1
2
3
4
5
int a = 10;
int *p = &a;
int *q = p;

q == p == &a;

(3)将0值赋值给一个指针变量 – 空指针

野指针:定义一个指针,没有明确指向,不能访问野指针

1
2
int *p = NULL;
char *p = NULL;

(4)将一个数组的数组名赋值给一个具有相同数据类型的指针变量

1
2
int a[5] = {1,2,3,4,5};
int *p = a; // a == &a[0]

(5)把一个复合形式的表达式的值赋给一个具有相同数据类型的指针变量

4、指针的运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int a = 2;
int *p = &a; // &a == 0x2000
p+n --> p向高地址位偏移n个元素大小的字节数 //元素指,该指针指向的内容
p-n --> p向低地址位偏移n个元素大小的字节数

p+n == p+n*sizeof(元素类型) //在该例中元素类型为int

注意:指针运算中没有 指针 + 指针、指针 * 指针、 指针 / 指针,因为没有任何实际意义
但是有指针 - 指针

指针-指针表示相同类型的两个指针之间相差多少个元素,结果的正负,仅代表地址高低
int a, b;
int *p = &a;
int *q = &b;
q - p == (q-p)/sizeof(int);

5、指针和一维数组

将一个一维数组的数组名赋值给一个具有相同数据类型的指针变量, 我们就可以通过该指针访问数组中所有元素

注:数组名不能递增递减

1
2
3
4
5
6
7
8
9
10
int a[4] = {1,2,3,4};
int *p = a;
*p == a[0];
*(p+1) == a[1];

p++; // p = p+1; right
a++; // a = a+1; error 数组名不能递增递减

数组a中的第三个元素的表达方式:
a[2]、 *(p+2)、 *(&a[2])、p[2]、 *(a+2)

6、指针和二维数组 – 行指针(数组指针)

​ 本质:数组指针是一个指针,存放的内容是地址,指针指向的内容是一个一维数组

​ 二维数组的数组名是一个行指针,指向二维数组的首地址,行指针+n相当于地址偏移n行元素

1
2
3
4
5
6
7
//行指针的定义一般形式
<存储类型> <数据类型> (*指针变量名)[列数];
int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = a;

*(*(p+1)+2) == 第二行第三个元素
*(*(p+0)+1) == 第一行第二个元素



三、例子

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
int x=258;
char *p = (char *)&x;

printf("%d ",*p);
printf("%d ",*(++p));
}
````
程序运行结果是 <u>2,1</u>

解:25816进制为102,按照int的存储方式为 00 00 01 02,p指针先到02,因为转移到char后+1为前进一个字符,则p指针跳到了01.

### 2.

```c
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *arr[3]={a[0],a[1],a[2]};
printf("%ld",sizeof(arr[0]))

程序运行结果是 8

解:arr数组里的都是指针,sizeof指向第一个元素即指针,所以大小为8,不是a[0][3]中的12.

3.

 若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是 D.
(A) p+1 (B) *(p+3)  (C) *(p+1)+3 (D) *(p[0]+2)

解:b错误原因是p+3仅代表地址,加个*只能表示p[3].

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信