Skip to content

1.概念

什么是指针?

指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。保存变量地址的变量。

为什么要使用指针?

生成更高效紧凑的代码

plain

1.1 地址、变量与指针

地址:内存区中对每个字节的编号
指针:内存中的一个地址
指针变量:存放另一个变量的地址
类型说明 * 变量名

*表示该变量为指针变量
变量名为指针变量名
类型说明为指向的变量类型

指针赋值:只能赋予地址,不能赋予其他数据
& 变量名

plain
#include<stdio.h>
int main()
{
    int a,b;
    int *point1,*point2;
    printf("请输入两个数:");
    scanf("%d%d",&a,&b);
    point1=&a;
    point2=&b;
    printf("两个数分别为:%d,%d",*point1,*point2);
}

引用指针变量:引用指针变量所指向的值

*指针变量

plain
#include<stdio.h>
int main()
{
    int *p,q;
    printf("请输入:");
    scanf("%d",&q);
    p = &q;
    printf("数字为:%d",*p);
}

1.2 指针运算

&  取值运算符

  • 指针运算符
    &*   先指针后取值
    *&  先取值后指针

指针自增自减按所指向类型的直接长度进行增减

plain
#include<stdio.h>
main()
{
    int i;
    int *p;
    printf("请输入一个数字:");
    scanf("%d",&i);
    p = &i;
    printf("结果1为:%d\n",p);
    p++;
    printf("结果2为:%d\n",p);
 }

2.数组与指针

数组指针:存储数组的首地址

plain
#include<stdio.h>
main()
{
    int *p,*q;
    int a[5],b[5],i;
    p=&a[0];
    q=b;
    printf("请输入第一个数组:\n");
    for(i=0;i<5;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    printf("请输入第二个数组:\n"); 
    for(i=0;i<5;i++)
    {
        printf("b[%d]=",i);
        scanf("%d",&b[i]); 
    }
    printf("数组a为:\n");
    for(i=0;i<5;i++)
    {
        printf("%5d",*(p+i));
    }
    printf("\n");
    printf("数组b为:\n");
    for(i=0;i<5;i++)
    {
        printf("%5d",*(q+i));
    }
    printf("\n");
    return 0;
}

二维数组

*(a+i)与a[i]是等价的

字符串指针

plain
#include<stdio.h>
main()
{
    char str1[] = "You are my god";
    char str2[30];
    char *p,*q;
    p=str1;
    q=str2;
    while(*p!='\0')
    {
        *q=*p;
        p++;
        q++;
    }
    *q='\0';
    printf("输出字符串为:\n");
    puts(str2);
}

字符串数组
类型名 数组名[数组长度]

plain
#include<stdio.h>
main()
{
    int i;
    char *month[]=
    {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
    };
    for(i=0;i<12;i++)
    {
        printf("%s\n",month[i]);
    }
}

3.双重指针

类型标识符 **指针变量名

plain
#include<stdio.h>
main()
{
    int i;
    char **p;
    char *month[]=
    {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
    };
    for(i=0;i<12;i++)
    {
        p=month+i;
        printf("%s\n",*p);
    }
}

4.函数参数

plain
//交换地址 
#include<stdio.h>
void Swap(int *a,int *b)
{
    int temp ;
    temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int x,y;
    int *c,*d;
    scanf("%d%d",&x,&y);
    c=&x;
    d=&y;
    Swap(c,d);
    printf("%d,%d",x,y);
    return 0;
}
plain
//嵌套调用
plain
//奇数之和
plain
//冒泡排序
plain
//字母顺序排序
plain
//数组元素求和

5.指针函数

类型名 *函数名(参数列表)*

plain
#include<stdio.h>
int per(int a,int b);
void main()
{
    int ilong,width,result;
    printf("请输入长和宽:");	
    scanf("%d%d",&ilong,&width);
    result=per(ilong,width);
    printf("周长为:%d",result);
}
int per(int a,int b)
{
    return (a+b)*2;
}

6.main参数

plain
#include<stdio.h>
main(int argc,char *argv[])
{
    printf("命令名:%s\n",*argv);
    printf("参数个数:%d\n",argc);
}