day12-c指针

day12-c指针

一、复习

1、指针变量的赋值

1
2
3
4
5
6
int b[5] = {1,2,3,4,5};
int a = 2;
int *p = &a; // 1
int *q = p; // 2
char *m = NULL; //空指针 3
int *n = b; // n == &b[0] //4

2、指针变量的运算

1
2
3
4
5
6
int *p;
p+n --> 向高地址位偏移n个元素的字节数
p-n --> 向低地址位偏移n个元素的字节数

指针-指针:计算两个相同类型的指针之间相差的元素个数

3、指针和一维数组

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

4、指针和二维数组

1
2
3
4
5
6
7
8
9
10
11
二维数组的数组名也表示整个二维数组的首地址。但是是一个行地址

数组指针定义的一般形式:
<存储类型> <数据类型> (*数组指针名)[列数];

int a[2][3] = {1,2,3,4,5,6};
a == &a[0]
a+1 == &a[1]

int (*p)[3] = a;
*(*(p+1)+1) --> 二维数组中第二行第二个元素



二、指针

1、指针数组

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

​ 指针数组:本质是数组。如果一个数组中所有元素都是地址,那么该数组称为指针数组

2、指针数组的定义

1
2
3
4
5
6
7
<存储类型> <数据类型> *数组名[元素个数];
例:
int a, b, c;
int *addr[3] = {&a, &b, &c};
addr[0] == &a;
addr[1] == &b;

3、多级指针–二级指针(难点)

​ 定义一个指针变量,有几个星号就是几级指针

​ 二级指针的定义:

1
2
3
4
5
6
7
8
<存储类型> <数据类型> **指针变量名;
例:
int a = 2;
int *p = &a;
int **q = &p;

*q == p == &a
**q == *p == *&a == a == 2

注意

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

p:数组指针名,p+1偏移一行数据大小
q:指针数组名,q+1偏移一个指针大小

int **x = p; //error****
int **x = q; //right

4、const指针

​ const修饰的变量为只读属性,不能直接修改该变量的值

​ const指针

​ (1)const 数据类型 *指针变量名;

​ 数据类型 const *指针变量名;

1
2
3
4
5
int a = 2;
int b = 3;
const int *p = &a;
p = &b; //right
*p = 10; //error *p被修饰为只读

​ const修饰是指针指向的内容,不能修改指针指向的数据,但是可以修改指针变量中的地址值

​ (2)数据类型 * const 指针变量名;

1
2
3
4
5
int a = 2;
int b = 3;
int * const p = &a;
p = &b; //error p被修饰为只读
*p = 10; //right

​ const修饰的指针变量p,不能修改指针变量的值,但是可以修改指针指向内容的值

(3)const 数据类型 * const 指针变量名;

1
2
3
4
5
int a = 2;
int b = 3;
int * const p = &a;
p = &b; //error p被修饰为只读
*p = 10; //error *p被修饰为只读

​ const同时修饰指针变量和指针指向内容,两者都不能修改

5、void指针

​ void – 空类型,不确定类型

1
2
3
4
5
6
7
int a = 2;
char b = 's';
void *p = &a;
p = &b;
指针p中可以存放任意类型的地址值
*p = 2; //error void指针在使用之前需要将void类型指针强制转换为需要的类型
*(int *)p = 2; //right

6、字符指针和字符串

1
2
3
4
5
6
char a[50] = {"hello"};

char *p = "hello"; //right
如果将一个字符串赋值给一个字符指针,相当于把该字符串的首地址赋值给字符指针变量

注意:如果将一个字符串常量赋值给一个指针变量,那么通过该指针不能修改字符串每一个字符的值

例子

1.

若有以下定义,且0≤i<4,则不正确的赋值语句是 B .
int b[4][6], *p, *q[4];
(A)q[i] = b[i]; (B) p = b;
(C)p = b[i] (D) q[i] = &b[0][0];

解:表示b的话要用二次指针来表示二维数组的地址。这样的话*p仅代表所对应的行地址

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:

请我喝杯咖啡吧~

支付宝
微信