C语言指针复习

本文来自https://blog.csdn.net/ccchenxi/article/details/83271212

第8章 指针
8.1 指针变量
1.指针变量定义及赋值:int a;  int *p=&a; 或 int a;  int *p;  p=&a;
2.指针运算符:(1)取地址运算符& (2)取内容运算符* (结合性均为右至左)
3.指针加1,不是纯加1,而是加一个所指变量的字节个数
4.指针变量作为函数参数,例,交换函数swap():
#include<stdio.h>
void swap1(int *p1,int *p2) //交换地址中的值
{
    int t; //p1,p2中存的是a和b的地址,将p1和p2地址中的内容交换,即p1中a地址中值变为b,p2中b地址中值变为a
    t=*p1;
    *p1=*p2;
    *p2=t;
}
void swap2(int *p1,int *p2) //交换形参指针指向的地址,无法返回给主函数p1,p2
{
    int *t; //交换后p1指向b地址,p2指向a地址,仅形参指向改变,不影响实参
    t=p1;
    p1=p2;
    p2=t;
}
int main()
{
    int a,b;
    int *p1,*p2;
    p1=&a;
    p2=&b;
    while(~scanf("%d%d",p1,p2))
    {
        printf("a=%d,b=%d\n",a,b);
        printf("p1=%d,p2=%d\n",p1,p2);
        swap1(p1,p2);
        printf("交换值结果:\n");
        printf("a=%d,b=%d\n",a,b);
        printf("p1=%d,p2=%d\n",p1,p2);
        /*
        swap2(p1,p2);
        printf("交换地址测试结果:\n");
        printf("a=%d,b=%d\n",a,b);
        printf("p1=%d,p2=%d\n",p1,p2);
        */
    }
    return 0;
}

8.2 指向数组的指针
8.2.1指向一维数组的指针
1.定义及赋值:int a[5],*p; p=&a[0]; 或p=a;
2.引用数组元素
(1)地址表示法:a[i]的地址:p+3、a+3、&a[i]
(2)数组元素表示法:a[i]的访问:*(p+3)、*(a+3)、a[i]
(3)指针变量加下标:指针变量可以加下标:p[i]
(4)指针变量与数组名的引用区别:数组名表示数组首地址,属于常量,p为指向数值a的指针变量,p++可以,a++不可以
(5)例,逆序输出10个数
#include<stdio.h>
int main()
{
    int i,n,*p,a[10];
    p=a;
    while(~scanf("%d",&n))
    {
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=n-1; i>=0; i--) //下标法访问数组
        {
            printf("%d ",a[i]);
        }
        printf("\n");
        for(i=n-1; i>=0; i--) //数组名访问数组
        {
            printf("%d ",*(a+i));
        }
        printf("\n");
        for(i=n-1; i>=0; i--) //指针变量访问变量(1)
        {
            printf("%d ",*(p+i));
        }
        printf("\n");
        for(p=a+n-1; p>=a; p--) //指针变量访问变量(2)
        {
            printf("%d ",*p);
        }
        printf("\n");
    }
    return 0;
}
12345678910111213141516171819202122232425262728293031323334
8.2.2指向多维数组的指针
int s[3][4];
1.行转列:s+0、s+1、s+2是每一行的首地址,进行的是行操作,若想利用s对行中各元素操作,必须将行操作方式转为列操作方式。转换方式*(s+i)(i=0,1,2)
2.二维数组的指针表示形式:
(1)数组首地址:s
(2)i行首地址:s+i = &s[i]
(3)i行j列元素地址:s[i]+j = *(s+i)+j = &s[i][j]
(4)i行j列元素:*(s[i]+j) = *(*(s+i)+j) = s[i][j]
3.指向多维数组的指针:
(1)指向数组元素的指针变量 int p=s[0];
(2)指向由m个元素组成的一维数组的指针变量:int (*p)[4]; p=s;
例:
#include<stdio.h>
int main()
{
    int s[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

//(1)用指向数组元素的指针变量输出数组元素
    int *p1;
    for(p1=s[0]; p1<s[0]+12; p1++)
    {
        if((p1-s[0])%4==0)
        {
            printf("\n");
        }
        printf("%d ",*p1);
    }
    printf("\n");
    //(2)用指向一维数组的指针变量输出任一行任一列的元素
    int i,j;
    int (*p2)[4];
    p2=s;
    scanf("%d%d",&i,&j);
    printf("%d\n",*(*(p2+i)+j));

return 0;
}
12345678910111213141516171819202122232425
8.3 指向字符串的指针
1.可以不定义字符数组,直接定义指向字符串的指针变量,利用指针变量操作字符串,如:
char *str = “I’m a student”;  printf(“%s\n”,str);
8.4 指向函数的指针
1.定义指向函数的指针变量格式:数据类型(*指针变量名)();
2.赋值格式:指针变量名=函数名;
3.调用格式:(*指针变量名)(实参表)
例:
//输入5个数,求最大值
#include<stdio.h>
int max(int *p)
{
    int i;
    int m=p[0];
    for(i=1; i<5; i++)
    {
        if(*(p+i)>m) m=*(p+i);
    }
    return m;
}
int main()
{
    int i,m,a[5];
    int (*f)(int *p); //定义指向函数的指针变量f
    for(i=0; i<5; i++)
    {
        scanf("%d",&a[i]);
    }
    f=max;  //将函数max入口地址赋值给f
    m=(*f)(a);  //利用指针变量f调用函数
    printf("%d\n",m);
    return 0;
}
12345678910111213141516171819202122232425
4.指向函数的指针做函数参数
5.返回指针值的函数
8.5 指向指针的指针(二级指针)
————————————————
版权声明:本文为CSDN博主「ccchenxi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ccchenxi/article/details/83271212

原文地址:https://www.cnblogs.com/pquan/p/12641862.html

时间: 2024-10-10 09:25:22

C语言指针复习的相关文章

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2

C语言指针

C语言指针 指针是什么? 指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元.我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等).通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系 /* ============================================================================ Name C语言指针 : text.c Author : Version : C

C语言--指针(一)

#import <Foundation/Foundation.h> //交换函数 void swap(int x, int y) { printf("x=%d,y=%d",x,y); int temp = 0; temp = x; x = y; y = temp; printf("x=%d,y=%d",x,y); } // void swap2(int *x , int *y) { //不改地址,改地址对应的值 printf("x=%d,y=%

C语言指针讲解

指针是C语言的一种数据类型,类似于C中的其他类型,例如int ,char 等.既然指针是一种类型,当我们定义该类型变量,该类型变量就称为指针变量. C中有了指针就有了指向.指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元. C语言指针是一个特殊的变量,其里面储存的数值被解释成为内存里的一个地址. 在计算机中,所有对数据的操作,都是通过其地址进行的,指针让程序的效率更高,代码更少. 在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所占

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

C语言指针的陷阱

C语言指针的陷阱   分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵活性以及广泛的使用,但也揭示了C是一种在应用时要时刻注意自己行为的语言.C的设计哲学还是那句话:使用C的程序员应该知道自己在干什么.有时用C写的程序会出一些莫名其妙的错误,看似根源难寻,但仔细

C语言指针占用字节

指针即为地址,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样. 指针占用几个字节跟语言无关,而是跟系统的寻址能力有关,16为地址指针即为2个字节,32位系统是4个字节,64位系统为8个字节. 用sizeof求长度: #include<stdio.h> void main(void) { printf("%d %d %d\n",sizeof(int),sizeof(double),sizeof(char)); } 在

关于c语言 指针课堂随笔

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看.每当遇到圆括号时,就应该掉转阅读方向.一旦解析完圆括号里面所有的东西,就跳出圆括号.重复这个过程直到整个声明解析完毕 1.指针的判断应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个 实例: int(*func)(int*p)    先从标识符func找起往右走  碰到圆括号 反转 从左走 func的指针  再往右碰到圆括号这是个函数    func是指

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后