C语言指针知识点(2)


1. 指针和数组

  • 数组名称保存的就是数组占用内存最小的那个地址
  • 所以指针也可以指向数组
  • 结论 如果用指针保存数组的地址后那么 p = arr = &arr
#include <stdio.h>
int main(){

    int arr[3] = {1,2,3};

    int *p = &arr;  // 定义指针变量指向数组arr

    printf("arr = %p\n",arr);   // arr = 0028FEB0

    printf("&arr = %p\n",&arr);   //  &arr = 0028FEB0

    printf("p = %p\n",p);    //  p = 0028FEB0

    return 0;
}

指针可以进行加减法

  • 应用场景 : 一般用在指针数组中
  • 指针变量+1是加多少,加的就是指针变量类型占用的字节数
  • 注意点
  1. -1操作一般企业开发不会用到
  2. 只有指针才可以做+1-1操作,数组名不可以
#include <stdio.h>

int main(){
    int arr[3] = {1,2,3};
    int *p = arr;

    printf("*p = %i\n",*p);   // * p = 1
    printf("*(p+1) = %i\n",*(p+1));  //*(p+1) = 2
    printf("*(p+2) = %i\n",*(p+2));  // *(p+2) = 3

    printf("*p = %i\n",*p++);  // 1 ---> p[0]--->1
    printf("*p = %i\n",*p++);  // 2 ---> p[1]--->2
    printf("*p = %i\n",*p);   // 3 --->[2]---3
    printf("*p = %i\n",*(--p)); // 2

    return 0;
}


2. 指针和字符串

  • 字符串本质就是数组,所以指针也可以指向字符串
  • 正式因为如此 ,所以定义字符串又多了一种方式
#include <stdio.h>
int main(){
    //字符串
    char str[] = {'a','b','c','\0'};
    char str1[] = "abc";

    char *str2 = "eng";  // 指针定义字符串

    printf("str = %s\n",str);  //str = abc
    printf("str1 = %s\n",str1);  // str1 = abc
    printf("str2 = %s\n",str2);  // str2 = eng

    return 0;
}

利用数组和指针定义字符串的区别:

  1. 储存的位置不同
  • 如果是通过数组定义的字符串,那么储存在内存的栈中
  • 如果是通过指针定义的字符串,那么储存在内存的常量区中
  1. 由于在内存中储存的位置不一样,所以特性也不一样
  • 数组定义的字符串,我们可以手动修改其内容
  • 指针定义的字符串,我们不能手动修改
  • 数组定义的字符串,每次定义都会重新开辟储存空间
  • 指针定义的字符串,重复定义不会重新开辟储存空间

代码如下

#include <stdio.h>
int main(){

    char str1[] = "abc";
    char str2[] = "abc";

    printf("str1 = %p\n",str1);  //  str1 = 0028FEBC
    printf("str2 = %p\n",str2); // str2 = 0028FEB8

    char *str3 = "abc";
    char *str4 = "abc";

    printf("str3 = %p\n",str3); // str3 = 0040407A
    printf("str4 = %p\n",str4); // str4 = 0040407A

    return 0;
}
  1. 接受字符串的时候,只能通过字符数组,不能通过字符指针
  2. 如果函数中返回的字符串是通过数组创建,那么外界无法获取
  3. 如果函数中返回的字符串是通过指针创建的,那么外界可以获取

字符串数组

  • 字符串数组就是一个数组,所以字符串数组就是一个二维数组
  • 第一钟格式
#include <stdio.h>
int main(){
    char str1 = "abc";
    char str2 = "def";
    char str3 = "gkk";
    
    char str[][] = { "abc"  , "def" , "gkk" }; 
    return 0;
}
  • 第二种
char *str1 = "lnj";
char *str2 = "abc";
char *str3 = "def";
char *str[] = {
        "lnj",
        "abc",
        "def"
    };

3. 指针变量和函数

  • 指向函数的指针
  • 计算机也会给函数分配储存空间,既然函数会分配内存空间,所以函数也有自己的地址,所以指针变量也可以保存函数的地址
  • 函数和数组很像,函数名中保存的就是函数的地址

1. 如何定义保存函数的指针变量

  • 将函数复制过来
  • 在函数返回值和函数名称中间加一个*
  • 修改函数名称为指针变量的名称
  • 注意点 要将" * " 和变量名称用括号括起来
#include <stdio.h>

void test();

int main(){

    //1.复制
   void test();
    //2.中间加*
   void *test();
    //3. 讲*和变量名称用括号括起来
   void (*test)();
    //4.修改函数名----->指针变量名
   void (*funcP)();
    //5.讲test函数的地址给指针变量 funcP
   funcP = &test;

   void (*funcP)() = &test; //直接声明 + 赋值

    return 0;
}

void test(){
    printf("hello world");
}

如果通过指针定义后就有三中调用函数的方式

  1. 第一种 函数名调用
test( );
  1. 第二种调用
(*funcP)(  );
*funcP---指向的就是test的地址
转化为
test( );
  1. 第三钟调用
funcP( );

指针和结构体

  • 结构体指针
    因为结构体变量也会分配内存空间,所以结构体变量也有内存地址,所以可以使用指针保存结构体变量的地址

  • 规律
    定义结构体变量的指针的方法和定义普通变量的方法一样
    如果指针指向了结构体变量,那么访问结构体变量的方法就有三中
    1.结构体变量.属性名称
    2.(*结构体指针变量名称).属性名称
    3.结构体指针变量名称->属性名称

#include <stdio.h>

int main(){

    //定义结构体
    struct Person {
        char *name;
        int age;
        int money;
    };

    struct Person per = {"小明",22,100};

    struct Person *p = &per;

    printf("per.name = %s\n",per.name);  // 1. per.name = 小明
    printf("(*p).name = %s\n",(*p).name);  // 2. (*p).name = 小明
    printf("p->name = %s\n",p->name); //3. p->name =小明
    return 0;
}

指针和作为函数参数使用

#include <stdio.h>

int test(int num1,int num2,int (*funP)(int,int));
int sum(int num1,int num2);
int min(int num1,int num2);
int main()
{

    int res = test(10,20,min); //调用的min函数
    printf("res = %i\n",res);

    int res2 = test(10,20,sum); //调用的sum函数
    printf("res2 = %i\n",res2);
    return 0;
}
//注意点: 指向函数的指针,作为函数的形参时, 指针变量的名称, 就是形参的名称
/* 函数在调用的时候test(10,20,sum) 传入的是谁就会指向那个函数
 * 
 */
int test(int num1,int num2,int (*funP)(int,int)){
    return funP(num1,num2);
}

int sum(int num1,int num2){
    return num1 + num2;
}

int min(int num1,int num2){
    return num1 - num2;
}

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

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,432评论 3 44
  • 第十章 指针 1. 地址指针的基本概念: 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为...
    坚持到底v2阅读 1,066评论 2 3
  • 每个人都会有一段孤独的时期,那段时光里,你总会在迷茫的思考,我,为什么而存活在这世上,我平庸的一生是为了寻找什么?...
    L蓝枫阅读 243评论 2 1
  • n the computer world, use restricted resource you have to...
    我是你的果果呀阅读 153评论 0 0
  • 疾病缠我身, 痛在父母心。 无以言表请, 深受父母恩。
    猪是你的幸运星阅读 164评论 0 0