C语言深入

1.

/*

二维数组和指针

*/

int main()
{
//    int *p[3];//p是个指针的数组,3个元素,p[0],p[1],p[2],元素是 int *,指向int的指针;三个指针是相互独立的;如果没有初始化,都是野指针;
    int a[2][3] = {{1,2,3},{4,5,6}};
    //a由两个行数组构成,a[0],a[1];每个数组里面有三个元素;
    int *q[2];//如果要访问a,每行一个指针指向首个元素,就可以去遍历a
//    q[0] = &a[0][0];//a[0][0]是a[0]数组的第一个元素,所以&a[0][0]=a[0];q[0]=a[0];
//    q[1] = &a[1][0];//a[1][0]是a[1]数组的第一个元素,所以&a[1][0]=a[1];q[1]=a[1];
    for(int i=0;i<2;i++)
    {
        q[i] = a[i];//和上面个等价
    }
//    q = a;//q和a两个都是数组,代表是数组的首地址,p是指针常量,不可改变;

    //通过q来遍历二维数组;
    //q[0]是a[0][0]的地址,
    //q[0]+j是a[0][j]的地址
    //*(q[0]+j)是a[0][j];

    //遍历第一行
//    for(int j=0;j<3;j++)
//    {
//        printf("%d ",*(q[0]+j));
//    }

    //通过q来遍历二维数组;
    //q[i]是a[i][0]的地址,
    //q[i]+j是a[i][j]的地址
    //*(q[i]+j)是a[i][j];
    //q[i]是q这个数组的第i个元素,q[i]=*(q+i);q可以看成是指向q[0]的常量指针;
    //*(q[i]+j)=*(*(q+i)+j)
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            printf("%d ",*(*(q+i)+j));
        }
        printf("\n");
    }
}

2.

/*

通过指针数组来传递二维数组

求和;

int *p[]:传递的是指针数组的首地址

int len1:传递的是数组里指针的个数;行数

int len2:每个指针可以偏移的范围;访问的元素的个数;列数;

*/

int sumArray(int *p[],int len1,int len2)
{

    //a[i][j]=*(*(p+i)+j)
    int sum=0;
    for(int i=0;i<len1;i++)
    {
        for(int j=0;j<len2;j++)
        {
            sum += *(*(p+i)+j);
        }
    }
    return sum;
}
int main()
{
    int a[2][3]={{1,2,3},{4,5,6}};
    int *q[2]={a[0],a[1]};//给q的两个指针赋值,都指向a的i行的第一个元素;

    printf("%d\n",sumArray(q, 2, 3));
    return 0;
}

3.

/*

数组指针:指向数组的指针

int (*p)[3];数组指针,就是一个指针;指向一个一维数组;一维数组的下标是3;数据类型是int

*/

int main()
{
    int a[2][3] = {1,2,3,4,5,6};//两个行数组的数组;a[0],a[1];都是下标是3的一维数组
    int (*p)[3];//p是一个指针,想指向一个下标是3的一维数组;a[0]和a[1]都是合适的对象;
//    p = &a[0]; //p指向a[0];指向一个行数组,可以认为是个行指针
    //a[0]是数组a的第一个元素;a=&a[0];
    p = a;//和上面等价;a的本质是常量指针,指向a[0],指向首个元素常量的常量指针,二维数组的名字,其实是个一维数组的常量指针;
    //a[i]=*(p+i);p向后移动i行,取出内容a[i],是一个数组;
    // a[i]+j = *(p+i)+j = &a[i][j];a[i]是一个行数组,可以看成是指向a[i][0]的常量指针,a[i]+j指向a[i][j]
    //a[i][j] = *(a[i]+j) = *(*(p+i)+j)把指向的内容取出来;

    //p 指向a[0]
    //p+i 指向a[i]
    //*(p+i) = a[i]=&a[i][0]
    //*(p+i)+j = &a[i][j]
    //*(*(p+i)+j) = a[i][j]
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            printf("%d ",a[i][j]);
            printf("%d ",*(a[i]+j));
            printf("%d ",*(*(p+i)+j));
        }
    }
}

//通过数组的指针来传递二维数组

4.

/*

int (*p)[3]:数组指针,指向数组的一行

int len:表示行指针可以向后偏移几次,就是偏移的行数,就是二维数组的行数;

*/

int sumArray(int (*p)[3],int len)
{
    int sum=0;
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<3;j++)
        {
            sum += *(*(p+i)+j);
        }
    }
    return sum;
}
int main()
{
    int a[2][3]={1,2,3,4,5,6};
    int (*p)[3];//定义数组指针
    p = a;//指向首行,
    int sum=sumArray(p, 2);//a的本质是行指针,值也是相等的;
    printf("%d ",sum);
    return 0;
}

5.

/*

函数指针

*/

int add(int a,int b)
{
    return a+b;
}
int main()
{
    int (*pfunc)(int ,int );//pfunc就是一个函数指针;变量
    pfunc = add;//函数名就是函数的入口地址;
    printf("%d ",add(10,20));
    printf("%d ",pfunc(10,20));//通过函数指针去调用函数
    return 0;
}

6.

/*

回调函数:通过函数指针去传递函数,在这个函数里面需要通过指针去访问其他函数

*/

void printHello()
{
    printf("hello\n");
}
void printWorld()
{
    printf("world\n");
}
void printSth(void (*pfunc)(), int count)
{
    for(int i=0;i<count;i++)
    {
        pfunc();
    }
}
int main()
{
    printSth(printHello,3);
    printSth(printWorld,3);
    return 0;
}

7.

/*

二级指针:

*/

int main()
{
    int a=10;
    int *p=&a;//p是个指针,指向的数据类型是int
    int **pp;//是个指针,指向的数据类型是int *
    pp = &p;//pp指向p,p是int *型
    printf("sizeof(pp)=%lu\n",sizeof(pp));
    /*
     pp:修改pp指向,指向另一个指针;
     *pp:修改p的指向,指向另一个int
     **pp:修改p指向的内容,就是a的值;
     */
    **pp = 100;
    printf("*p=%d,a=%d\n",*p,a);
    return 0;
}
void swap(int **x,int **y)
{
    int temp = **x;
    **x = **y;
    **y = temp;
}
int main()
{
    int a=10,b=20;
    int *p = &a;
    int *q = &b;
    int **pp = &p;
    int **qq = &q;
    swap(pp,qq);
    printf("a=%d,b=%d\n",a,b);
}

8.

//const 修饰符:只读的意思;

/*

*/

int main()
{
    int value=10;
    const int a=100;//a不能改;
    //a++;//是错的
    const int *p = &value;//p可以改,*p不能改;
    p++;
    //*p=1000;//错;
    int const *m = &value;//m可以改,*m不可以改;
    int *const n  = &value;//n不能改,*n可以改
    const int *const q;//q不能改,*q也不能改
    const int *const m1,*n1;//m1,*m1,*n1不能改,n1可以改

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 21:28:33

C语言深入的相关文章

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

C语言轻松高效学习方法之:多种方法实现

多种方法实现同一个功能,可以调动你学的所有知识去做,有助于你学的融会贯通. 下面举例来看: 实现功能:求一个整数的位数: 实现语言:C语言: 开发环境:Visual Studio 2017 如:3215是4位数 实现原理: 3215/10 = 321 ----1位数 321/10 = 32 ----又是1位数 32/10 = 3 ----又是1位数 3/10 = 0 ----又是1位数 共4位数,且终止计算条件是/10结果为0的时候: 根据这个原理,先写一个最笨的原始方法: 效果: 这种实现方案

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

自动生成小学四则运算题目(C语言)

这个简易四则运算是我在百度上找的博主叫53余雅诗的一篇c语言代码,网址为http://www.cnblogs.com/ys1101/p/4368103.html,功能是可以选择加减乘除进行简易的四则运算,判断对错.我在VS2017上编译没有bug,因为功能只有整数运算,所以我在此基础上加了真分数的四则运算以及统计得分等,最后成功运行程序.我把我的源代码放在github上,地址为https://github.com/xiaofancheng/helloworld.

PAT 1009 说反话 C语言

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格. 输出格式:每个测试用例的输出占一行,输出倒序后的句子. 输入样例: Hello World Here I Come 输出样例: Come I Here World Hello 1 #include<stdio.h> 2 #

PAT 1006 换个格式输出 C语言

让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定的格式输出n. 输入样例1: 234 输出样例1: BBSSS1

Go语言 IDE之Gogland配置使用

Gogland 是 JetBrains 公司推出的 Go 语言集成开发环境.Gogland 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系.目前正式版尚未发布.官方:https://www.jetbrains.com/go/.关于使用,即将开始咯! 一.安装Golang 1) 首先到https://golang.org/dl/选择适合你系统的安装包,(墙内:http://golangtc.com/download). 2)下载完成安装到指定目录即可.我这里是(D:\G

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的