编程菜鸟到大佬之路:C语言程序(十四)

第十四天学习精要

指针的基本概念和用法


指针的基本概念

  • 每个变量都被存放在从某个内存地址(以字节为单位)开始的若干个字节中。

  • 指针也称作指针变量,大小为4个字节(或8个字节)的变量,其内容代表一个内存地址

  • 通过指针,能够对该指针指向的内存区域进行读写。

指针的定义和内容

  • 类型名 * 指针变量名;

    • int * p;
      • p 是一个指针,变量 p的类型是 int *。
    • char * pc;
      • pc 是一个指针, 变量 pc 的类型是 char *。
    • float *pf;
      • pf 是一个指针,变量 pf 的类型是 float *。
  • int * p = ( int * ) 40000;

    • p指向地址40000,地址p就是地址40000。
    • *p 就代表地址40000开始处的若干个字节的内容。
  • 通过指针访问其指向的内存空间

int * p = ( int * ) 40000;
// 往地址40000处起始的若干个字节的内存空间里写入 5000
*p = 5000;
// 将地址40000处起始的若干字节的内容赋值给 n
int n = *p;    // “若干” = sizeof(int),因为 int * p;

指针定义总结

  • T * p ;
    • T 可以是任何类型的名字,比如 int,double,char 等等。
    • p 的类型:T *。
    • *p 的类型: T。
    • 通过表达式 * p,可以读写从地址p开始的 sizeof(T)个字节
    • *p 等价于存放在地址p处的一个 T 类型的变量。
    • * :间接引用运算符。
    • sizeof(T*) :4字节(64位计算机上可能8字节)。

指针用法

  • & : 取地址运算符。

  • &x : 变量x的地址(即指向x的指针)。

  • 对于类型为 T 的变量 x,&x 表示变量 x 的地址(即指向x的指针)。

  • &x 的类型是 T *。

# include <iostream>
# include <cstring>
using namespace std;
int main()
{
	char ch1 = 'A';	
	char *p1 = &ch1;	// 使得p1指向变量ch1
	*p1 = 'B';	// 使得ch1 = 'B'
	cout << ch1 << endl;
	char ch2 = *p1;	// 使得ch2 = ch1
	p1 = &ch2;	// 使得pc 指向变量ch2
	*p1 = 'D';	// 使得ch2 = 'D'
	cout << ch2 << endl;
	return 0;
}

指针的意义和互相赋值


指针的作用

  • 有了指针,就有了自由访问内存空间的手段。

    扫描二维码关注公众号,回复: 3667536 查看本文章
  • 不需要通过变量,就能对内存直接进行操作。

  • 通过指针,程序能访问的内存区域就不仅限于变量所占据的数据区域。

  • 在C++中,用指针p指向a的地址,然后对p进行加减操作,p就能指向a后面或前面的内存区域,通过p也就能访问这些内存区域

指针的互相赋值

  • 不同类型的指针,如果不经过强制类型转换,不能直接互相赋值

指针的运算


指针的运算

  • 两个同类型的指针变量,可以比较大小:

    • 地址p1<地址p2: p1< p2 值为真。
    • 地址p1=地址p2:p1== p2 值为真。
    • 地址p1>地址p2:p1 > p2 值为真。
  • 两个同类型的指针变量,可以相减:

    • 两个T * 类型的指针 p1和p2。
    • p1 – p2 = ( 地址p1 – 地址 p2 ) / sizeof(T)
  • 指针变量加减一个整数的结果是指针:

    • p : T * 类型的指针。
    • n : 整数类型的变量或常量。
    • p+n : T * 类型的指针,指向地址:地址p + n × sizeof(T)
  • 指针变量可以自增、自减:

    • T* 类型的指针p指向地址n。
    • p++,++p:p指向 n + sizeof(T)。
    • p–,--p :p指向 n - sizeof(T)。
  • 指针可以用下标运算符“[ ]”进行运算

    • p 是一个 T * 类型的指针,
    • n 是整数类型的变量或常量
    • p[n] 等价于 *(p+n)
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
	int *p1, *p2;
	int n = 4;
	char *pc1, *pc2;
	p1 = (int *)100;	// 地址p1为100
	p2 = (int *)200;	// 地址p2为200
	// 输出 1) 25, 因(200-100)/sizeof(int) = 100/25 = 4
	cout<< "1) " << p2 - p1 << endl;
	pc1 = (char *)p1;	// 地址pc1为100
	pc2 = (char *)p2;	// 地址pc2为200
	// 输出 2) -100,因为(100-200)/sizeof(char) = -100
	cout << "2) " << pc2 - pc1 << endl; 
	cout << "3) " << (p2 + n) - p1 << endl;	// 输出 3) 29
	int * p3 = p2 + n; // p2 + n 是一个指针,可以用它给 p3赋值
	cout << "4) " << p3 - p1 << endl;	// 输出 4) 29
	cout << "5) " << (pc2 - 10) - pc1 << endl;	// 输出 5) 90
	return 0;
}

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/83006337