Linux学习笔记(二)

接到上一篇Linux学习笔记(一)

指针:地址

1、指针变量:存地址(存地址)

定义: int a ; int *p;说明符,说明变量p为一个指针变量
p==&a; int a=10;int *p = &a;int *q = &a;int *p = q;
只有在定义变量时候*才是说明符,其他都为运算符.
访问: Printf(“%d\n”,a); printf(“%d\n”,*p)
*指针运算符:取对应地址里面的值.
区别: a为常量(a不能自加) p 为变量(p可以自加)

2、一维数组和指针

定义: int a [10]={1,2,3,4,5,6};
数组各地址的值如图:
在这里插入图片描述
int *p=a;p指向a地址

访问: a[0]==*p a[3]==p[3]; *(a+5)==*(p+5)
地址取用方法替换:

int b[10] = {1,2,5,8,6,8,6,4};
int *q=b;
printf("%d\n",*(q+2));//b[2]  *(b+2)  p[2]

拓展:

printf(%p\n”,a);//%p打印地址
printf(%x\n”,a);//无符合十六进制小写字母
printf(%X\n”,a);//无符合十六进制大写字母
printf(%o\n”,a);//有符号八进制整数

3、Char型指针

定义:

char a; char *p=“hello”;//hello为指针/地址
char p[5]=“hello”;   
char *p=“hello”;

两者区别: 前者后面没有’/0’结束,后者有’/0’

4、二维数组与指针

定义:

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

地址取用方法替换:

int a[3][4] = {{1,2,3,5},{5,6,8,7},{4,5,8,9,}};
int *p = a[0];
printf("%p\n",p+4);//a[0]+4  a+1  &p[4]  &a[1][0]
printf("%d\n",*(p+2));//*(a[0]+2)  p[2]  a[0][2]

指针数组和数组指针

指针数组:int *a[3];
数组指针: (*p)[2]===指向整个数组的指针
函数指针数组:int (*a[3])();

Eg:
char *p[3] = {"hello","world","wyj"};//p[0]指针对应于hello,p[1]对应于world,p[3]对应于wyj
printf("%s\n",p[1]+2);//输出rld

函数

函数: 解决特定问题的方法. 形式:数据类型 函数名(参数类型列表(形参或实参))
格式

数据类型
{
     函数功能具体实现
}
printf();scanf();getchar();putchar();

举例:

#include<stdio.h> 
int max(int,int);   //函数的申明
int main() {
    int a,b,c;
    scanf("%d%d",&a,&b);
    c = max(a,b);    //使用函数max
    printf("%d",c);
    return 0;
}
//返回类型 函数名称 (参数类型 参数)
int max(int a, int b){ 
    if(a > b){
        return a;
    }                      //函数主体
    else{
        return b;
    }
}
  1. 函数原型由函数返回类型、函数名和参数表组成,它与函数定义的返回类型、函数名和参数表必须一致。函数原型必须包含参数的标识符(对函数声明而言是可选的);说明:系统标准函数并没有在包含文件中定义,而只是提供了函数原型。在调用函数时,系统会正确地调用库函数。 注意:函数原型与函数定义必须一致,否则会引起连接错误。
  2. 函数传参方式:函数传参就是一个值拷贝的过程

值传递:
地址传递:取*对里面的内容进行取值
代码:

//指针及地址指令:
#include<stdio.h>
int main(){
    int a[3][4] = {{1,2,3,5},{5,6,8,7},{4,5,8,9,}};
    int *p = a[0];
    printf("%p\n",p+4);//a[0]+4  a+1  &p[4]  &a[1][0]
    printf("%p\n",a[1]);
    printf("%p\n",a[1]+1);
    printf("%d\n",p[2]);
    printf("%d\n",*(p+2));//*(a[0]+2)  p[2]  a[0][2]
    printf("%d\n",*(a[2]+1));
    printf("%d\n",a[1][2]);
    printf("%p\n",&a[1][0]);
    printf("%p\n",*(a+1));
    
    int b[10] = {1,2,5,8,6,8,6,4};
    int *q=b;
    printf("%d\n",*(q+2));//b[2]  *(b+2)  p[2]

    char *w[3] = {"hello","world","wyj"};
    printf("%s\n",w[1]+2);//=rld
    return 0;
}

运行结果:
在这里插入图片描述

收获及感悟:

通过今天的学习进一步的巩固了有关指针的用法,以前对指针数组、数组指针和函数指针数组就非常紊乱,无法分清什么是指针数组、数组指针和函数指针数组以及如何用它们,今天的学习解决了以前的困惑;还有就是今天最大的收获是了解了更多的地址取址指令。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手の明天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值