自学笔记之C++(9)--指针

    技术2024-04-17  15

    指针

    指针的概念 每个变量在内存中存放都对应一段地址,其首字节即为变量的地址,将存放地址的变量称为指针变量。 int x=4; x的地址为1001 &x的值为1001 *(&x)的值为4 其中:

    &->取地址运算 。。。&x为x的值

    *为取内容运算。。。 *(&x)为取存放在x的地址中的取内容

    定义 : *数据类型 标识符;

    数据类型为指针所指向数据的类型“ * ”是一个标志指针变量的标志

    初始化: 在定义指针变量的同时为其赋一个地址值 int a=5,*p=&a; 等价于 int a =5, *p; p=&a ; 这里面 *(&a)与 *p 都代表a的值,p代表的是指向变量a的指针变量。

    赋值运算:

    int a,*p,*p1,*p2;

    p=NULL; 不指向任何对象p=&a ; p指向ap1=&a ;p2=p1; 同类型的指针变量相互赋值;p = new int ; 为p动态分配存放一个整数空间p = new int [10]; 为p动态分配一个存放10个整数的空间

    int a, *p; float f; p=1000; 不能随意将一个整数值赋值给指针变量 p=&f; 类型不一致

    加减整数 p+n(p-n):指向p后面的或前面的第n个元素 自加自减 p++(p–) 指向p后面或前面的一个元素

    指针相减 两同类型的指针相减,结果为两个地址差之间能够存放的数据个数 【例】int *p1, *p2; -----设p1指向1000,p2指向1008 p1-p2=(1008-1000)/sizeof(int )=2 【注】 sizeof(int ):4 sizeof(char):1 sizeof(float):4 sizeof(double):8

    指针与一维数组的关系

    int a[10],p=a; (1)p <=> a <=> &a[0] (2)p+i <=> a+i <=> &a[i] (3) *(p+i) <=> * (a+i) <=>a[i]

    数组元素的表示:

    数组名[下标] ……a[i]*(地址) …… *(&a)*指针变量名 *p #include <iostream> using namespace std; int main() { int a[10], i, * p = a; for (i = 0; i < 5; i++) cin >> *p++; for (i = 0; i < 5; i++) cout << a[i] << ' '; return 0; }

    若将最后输出部分的a[i]换成p[i]则输出为任意值。 因为输入的值是放入a中的a是地址常量,而p做为地址变量,是为a赋值的。

    【 * p++中++作用于指针变量p,即先取出 *p的内容,再让p指向下一个元素】(* p)++中++作用于所指内容,即先取出p 的内容,再*p的值加一

    数组指针与字符数组对字符串处理的区别 【例】输入一字符串,用指针方式逐一显示字符,并求其长度

    #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main() { char * p, * q; p = new char[100]; //cin >> p; gets(p); //char gets_s(char *p); q = p; cout << "输出每个字符:"; while (*p != '\0') cout << *p++ << ' '; cout << "\n输出字符长度:" << p - q << endl; return 0; }

    【问题】 案例中的代码是这样写的,BUT!!用的VS2019中没有了 gets 函数,想着用gets_s代替,没有错误但有警告,说“使用未初始化的内存’*p’ ”,出不来想要的结果,用cin只能输出连续的字符串,有空格就不行,如下图 ,没搞懂 [头秃]

    Processed: 0.013, SQL: 9