C基础--初学指针

一、指针简介(任何指针变量在内存中占八个字节的存储空间)

1.定义指针变量(格式):变量类型 *变量名;--定义一个指向整形变量的指针  int *p;

2.作用:指针变量就是用来存储其他变量的地址;--int a=10;

  //指针将变量a的地址赋给指针变量p

  p = &a;//&是取地址符号,数组有两种方法获得内存中的地址--例:

  方法1:数组的变量名就是数组内存中的地址

  //定义一个int类型的数组

  int ages[2] = {10, 20 };//将数组的地址赋给指针变量p

  p = ages;  或者  p = &ages;

  方法2:数组中的第一个的地址就是该数组的地址--定义变量之后,在内存中开辟存储空间是从大到下寻地址,存放变量时,是在开辟的空间中,从小到大分配地址

  p = ages[0];

  图解:只是为了讲解,内存地址有地方不对

3.访问:

  指针变量中存入了某个变量的地址后,,可以通过地址来访问或者改变地址中的变量,方式:

  *p = 11;

二、指针注意点:

1.任何指针变量都占用8个字节的存储空间

2.指针类型只能指向对应类型的变量,比如int *p只能指向int类型的数据,不然会出错

3.指针是用来存储地址的,不要随便赋值一个变量。例如:

  float *p1 ; p1 = 100 ;--这是错误写法

4.float f =1.5f ;

  float *p = &f ;//这一句代码其实做了2件事--1)定义了指针变量p;2)让指针变量p指向了f

  *p = 5.6f ;

三、指针和数组

利用指针遍历数组元素,方法一:这种遍历方式,指针的值从未变过

 1 void test3()
 2 {
 3     int ages[4] = {10, 11, 56, 47};
 4     
 6     int *p = ages;
 7     
 8     //p + 1; // &ages[1]
 9     //p + 2; // &ages[2]
10     //p + 3; // &ages[3]
11     //p + i; // &ages[i]
12     
13     for (int i = 0; i<4; i++)
14     {
15         int num = *(p + i);
16         printf("ages[%d]=%d\n", i, num);
17     }
18     
19     // 这种遍历方式,指针的值从未变过
20     printf("%d\n", *p);
21     
22 }

利用指针遍历数组元素,方法二:这种遍历方式,指针的值一直在改变

 1 void test5()
 2 {
 3    int ages[4] = {10, 11, 56, 47};
 4     
 5    int *p = ages;
 6     
 7     for (int i = 0; i<4; i++)
 8     {
 9         printf("ages[%d]=%d\n", i, *p);
10         p++;
11         // p = p + 1;
12     }
13     
14     // 这种遍历方式,指针的值一直在改变
15 }

四、详解指针的p+1

1.指针变量的+1并不是基本数据类型中简单的+1;

2.p+1究竟是增加了多少,取决于指针的类型;

  指针的p+1跟指针所指向的数据类型有关,如下:

  char *    1

  int *       4

  double *    8

  long *    8

 

五、指针与字符串:重点--char *name = "hello" ;-->不可改变(可以理解为字符串常量)        char name[] = "hello" ;-->可以改变(可以理解为字符串变量)

1.利用数组存储的字符串是可变的

 1 void test1()
 2 {
 3     int a;
 4     
 5     // 利用数组存储的字符串是可变的
 6     char names[] = "itcast";
 7     
 8     //char names[] = {'i', 't', 'c', 'a', 's','t', '\0'};
 9     
10     char *p = names;
11     
12     *(p + 3) = 'A';
13     
14     //printf("%s\n", p + 2);
15     
16     printf("%s\n", names);
17 }

2.直接利用 指针变量指向的字符串,是不可变的

 1 void test2()
 2 {
 3     // names这个指针变量指向了字符串的首字符'i'
 4     // 直接利用指针变量指向的字符串,是不可变
 5     char *names = "itcast";
 6     char *names2 = "itcast";
 7     
 8     // names和names2指向的是同一个字符
 9     printf("names=%p\n", names);
10     printf("names2=%p\n", names2);
11 }

3.学习指针之前的字符串存储

  char name[] = "hello" ;

  char names[2][10] = { "hello" , "world" };

4.学习指针之后的字符串存储:

  char *name = "hello" ;

  //指针数组:数组里面装的元素是指针

  //整形数组:数组里面装的元素是整型数据

  char *names[2] = { "hello" , "world" } ;

posted @ 2016-01-13 13:51  Chaos_G  阅读(198)  评论(0编辑  收藏  举报