关于指针

c/c++是系统编程语言,处于运行效率的考虑,提供了指针这样的机制可以直接操作内存。而指针本身其实是虚拟内容的地址,比如在一个32位的操作系统上,一个进程的虚拟地址空间为4g,虚拟地址从0x0到0xFFFFFFFF,这段中的任何一个值就是内存地址。

如果指着指向的内容是代码的话,那么指向的是这块代码的入口地址,这个指针就叫做函数指针,比如int (*pmain)(int argc, int argv)。

这种直接操作内存的方式有利有弊,坏处在于大部分程序员管理不好内存,经常会出现内存泄漏,访问异常内存地址等各种问题。

指针用法

下面通过一些例子,来了解一下关于指针,引用的用法。

#include <iostream>
#include "pointer.h"
// 自己定义了一个pointer.h的头文件,用“”, 在c/c++中,函数的引用调用必须再在函数的定义之前
// 一般都会自己定义一个头文件。如果没有指定头文件的路径,那么会在当前文件夹中中寻找pointer.h
// 如果pointer不是在一个文件中,则制定头文件的路径,或者通过makefile的方式定义路径
using namespace std;

int main(){
    int x = 12345;
    int *p = &x;
    cout << "p = " << p << endl;
    cout <<"int *p = &x , *p = " <<*p << endl;
    // int *p,此处为定义一个p指针,在定义的时候*p的作用是表明变量p是一个指针,不是解引用,指针p指向的内容是变量x的地址
    // p打印出来为一串地址,定义之后*的使用为对指针地址的解引用,该内容指向的是变量x的内容

    changePointers(p);
    // changePointers(&x);
    cout << "changePointers(p), *p = " << *p << endl;
    // 给函数传递的真正的参数叫做实参,修改地址指向的内容变为404,changePointers(p)和changePointers(&x)一样

    int y = 789;
    p = &y;
    cout << "p = &y; *p = " << *p << endl;
    // 将p指针指向的内容改变为y的地址,解引用指针后,指针地址中指向的内容为变量y的内容

    int &ref = x;
    ref = 101;
    cout << "int &ref = x, x = " << x << endl;
    cout << "int &ref = x, ref = " << ref << endl;
    // 此处用法为ref是x的引用,即ref是x的别名,如果ref发生了变化,x也会发生变化

    changeNoRef(ref);
    cout << "changeNoRef(ref), ref = " << ref << endl;

    changeRef(ref);
    cout << "changeRef(ref), ref = " << ref << endl;

}

    void changeNoRef(int ref){
        ref = 202;
    }
    // 修改形参的值为202,但是该函数返回后,实参的值不会受到影响

    void changeRef(int & ref){
        ref = 303;
    }
    // 修改形参的值为303,该函数返回后,实参的值会被修改为303

    void changePointers(int *pointer){
        *pointer = 404;
    }
    // int *pointer表明形参是一个地址,在定义指针的时候,*不是为指针的解引用。
    // 可以通过指针的方式修改实参的值,但是形参在使用的时候必须使用解指针引用符号*
    // *pointer表示形参地址解引用后指向的内容被更改为404

结果为:


指针基本用法

字符与字符串

字符串与指针的用法比较绕,尤其是const char* 与char const和char const也是面试的常见题目

#include <iostream>
using namespace std;

int main(){
    string a = "abcd";
    cout << "a = " << a << endl; 
    // string a代表字符串

    char b = 'i';
    cout << "b = " << b << endl;
    // char b表示字符

    char c[] = "efg";
    cout << "c = " << c << endl;
    // char c[]真正的实现为: char *c = (char *)malloc(n);  其中n为要开辟空间的大小
    // c是数组对应着一块内存区域,其地址和大小在生命周期内不会被改变,只有数组的内容可以改变
    // 和int[]数组不同,此处c可以直接将字符串打印出
    cout << "sizeof c : " << sizeof(c) << endl;

    a = c;
    cout << "a = c, a = " << a << endl;
    // string 可以与char c[]进行转化

    const char *d = "efg";
    cout << "d = " << d << endl;
    // char *d定义了一个char类型的指针,指针中存放的地址,并不知道内存单元有多大,所以如果此时要改变数组中的内容用d[2] = ‘d’是非法的
    // 注意,此处如果不加const,编译器是会报错的,const char *ptr 表示的是指向字符串常量的指针,不能修改指针指向的内容

    char const *d2 = "hello";
    cout << "d2 = " << d2 << endl;
    // char const *ptr 与 const char *ptr等价

    char *const d3 = c;
    cout << "d3 = " << d3 << endl;
    // 定义一个指向字符的指针常数,即指针是const,但是字符串的内容可以修改
    d3[2] = 'x';
    cout << "d3[2] = 'x', d3 = " << d3 << endl;
}

结果为:


字符串与指针

关于数组与指针

与字符串不同,数组默认指向的是数组元素的首地址,必须要通过解引用的方式获得数组的元素。

#include <iostream>
using namespace std;

int main(){
    int array_a[] = {1, 2, 3};
    cout << "array_a = " << array_a << endl;
    cout << "*array_a = " << *array_a << endl;
    cout << "*(array_a+1) = " << *(array_a + 1) << endl;
}
数组与指针
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容