从零玩转C语言程序设计

14-一级指针和多级指针-指趣学院

2018-09-07  本文已影响402人  极客江南

指针基本概念

int num = 6; // 占用4个字节
//那么变量num的地址为: 0ff06

char c = 'a'; // 占用1个字节
//那么变量c的地址为:0ff05

什么是指针


什么是指针变量

    int age;// 定义一个普通变量
    num = 10;
    int *pnAge; // 定义一个指针变量
    pnAge = &age;

定义指针变量的格式

char ch = 'a';
char *p; // 一个用于指向字符型变量的指针
p = &ch;  
int num = 666;
int *q; // 一个用于指向整型变量的指针
q = #  
  • 其中,*表示这是一个指针变量
  • 变量名即为定义的指针变量名
  • 类型说明符表示本指针变量所指向的变量的数据类型

指针变量的初始化方法

int a = 5;
int *p = &a;
int a = 5;
int *p;
p=&a;
int *p=NULL;
int *q=0;
int *p;
p =  250; // 错误写法
int *p;
*p=&a; //错误写法
int a = 5;
int *p = &a;
int b = 10;
p = &b; // 修改指针指向

访问指针所指向的存储空间

int *p=NULL; // 定义指针变量
int a = 5;
int *p = &a;
printf("a = %d", *p); // 访问指针变量

指针类型


二级指针

    char c = 'a';
    char *cp;
    cp = &c;
    char **cp2;
    cp2 = &cp;
    printf("c = %c", **cp2);
int ***m1;  //取值***m1
int *****m2; //取值*****m2

练习


数组指针的概念及定义

    printf(“%p %p”, &(a[0]), a); //输出结果:0x1100, 0x1100
  • 注意: 数组名a不代表整个数组,只代表数组首元素的地址。
  • “p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给 p”

指针访问数组元素

    int main (void)
{
      int a[5] = {2, 4, 6, 8, 22};
      int *p;
      // p = &(a[0]); 
      p = a;
      printf(“%d %d\n”,a[0],*p); // 输出结果: 2, 2
}

  • 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同 一数组中的上一个元素。
    int x[10];
    x++;  //错误
    int* p = x;
    p++; //正确

指针与字符串

char string[]=”I love lnj!”;
printf("%s\n",string);
// 数组名保存的是数组第0个元素的地址, 指针也可以保存第0个元素的地址
char *str = "abc"
har *str = "lnj";
for(int i = 0; i < strlen(str);i++)
{
  printf("%c-", *(str+i)); // 输出结果:l-n-j
}
//   + 使用字符数组来保存的字符串是保存栈里的,保存栈里面东西是可读可写,所有可以修改字符串中的的字符
//   + 使用字符指针来保存字符串,它保存的是字符串常量地址,常量区是只读的,所以我们不可以修改字符串中的字符
char *str = "lnj";
*(str+2) = 'y'; // 错误
// 错误的原因是:str是一个野指针,他并没有指向某一块内存空间
// 所以不允许这样写如果给str分配内存空间是可以这样用 的
char *str;
scanf("%s", str);

指向函数指针

    int sum(int a,int b)
    {
        return a + b;
    }

    int (*p)(int,int);
    p = sum;
上一篇 下一篇

猜你喜欢

热点阅读