首页 > 学院 > 开发设计 > 正文

【学习笔记】【C语言】指针

2019-11-14 18:47:59
字体:
来源:转载
供稿:网友

一、指针变量的定义

1. 格式:变量类型 *指针变量名;
2. 举例:int *p;   char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征

二、利用指针变量简单修改其他变量的值

1.指向某个变量
int a;

int *p;
p = &a;
或者
int *p = &a;

2.修改所指向变量的值
*p = 10;

3.在函数内部修改外面变量的值
int a = 10;
change(&a);

void change(int *n)
{
    *n = 20;
}

三、指针与数组

1.将数组当做函数参数传入时,会自动转为指针

四、指针与字符串

1.定义字符串的2种方式
1> 利用数组
char name[] = "ios";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改

2> 利用指针
char *name = "ios";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

2.定义字符串数组
1> 利用二维字符数组
char names[2][10] = {"jack", "rose"};

2> 利用指针数组
char *names[2] = {"jack", "rose"};

五、代码

1.定义

 1 #include <stdio.h> 2  3 void change(int); 4  5 int main() 6 { 7     /* 8     int a = 90; 9     10     change(&a);11     12     PRintf("a=%d/n", a);13     */14     15     // 变量类型  变量名;16     // 格式:变量类型 *变量名;17     // 定义了一个指针变量p18     // 指针变量只能存储地址19     // 指针就一个作用:能够根据一个地址值,访问对应的存储空间20     // 指针变量p前面的int:指针变量p只能指向int类型的数据21     int *p;22     23     int a = 90;24     25     // 指针变量p指向了变量a26     p = &a;27     28     *p = 10;29 30     a = 20;31     32     printf("%d/n", *p);33     34     //printf("%d/n", a);35     36     return 0;37 }38 39 void change(int n)40 {41     n = 10;42 }

2.使用注意

 1 #include <stdio.h> 2  3 int main() 4 { 5     /* 不建议的写法, int *p只能指向int类型的数据 6     int *p; 7     double d = 10.0; 8     p = &d;*/ 9     10     /* 指针变量只能存储地址11     int *p;12     p = 200;13     */14     15     /* 指针变量未经过初始化,不要拿来间接访问其他存储空间16     int *p;17     printf("%d/n", *p);18     */19     20     int a = 10;21     /*22     int a;23     a = 10;24     */25     26     /*27     int *p;28     p = &a;29     */30     // 定义变量时的*仅仅是一个象征,没有其他特殊含义31     int *p = &a;32     33     // 不正确的写法34     // *p = &a;35     p = &a;36     37     // 这个时候的*的作用:访问指向变量p指向的存储空间38     *p = 20;39     40     41     char c = 'A';42     43     char *cp = &c;44     45     *cp = 'D';46     47     printf("%c/n", c);48     49     return 0;50 }

3.指向指针的指针

 1 #include <stdio.h> 2 int main() 3 { 4     int a = 10; 5      6     int *p = &a; 7      8     int **pp = &p; 9     10     // a = 20;11     12     // *p = 20;13     14     /*15     (*pp) == p16     17     *(*pp) == *p = a18     19     **pp == *p = a20     */21     **pp = 20;22     23     printf("%d/n", a);24     25     //int ***ppp = &pp;26     27     /*28     char a2 = 'A';29     char *p2 = &a2;30     */31     32     return 0;33 }

4.练习

 1 #include <stdio.h> 2 void swap(int *v1, int *v2); 3  4 int main() 5 { 6     /* 7     int a = 10; 8     int b = 11; 9     10     swap(&a, &b);11     */12     13     14     int a2 = 90;15     int b2 = 89;16     17     swap(&a2, &b2);18     19     printf("a2=%d, b2=%d/n", a2, b2);20     return 0;21 }22 23 /* 不能交换外面实参的值,仅仅是交换了内部指针的指向24 void swap(int *v1, int *v2)25 {26     int *temp;27     temp = v1;28     v1 = v2;29     v2 = temp;30 }*/31 32 // 完成两个整型变量值的互换33 void swap(int *v1, int *v2)34 {35     int temp = *v1;36     *v1 = *v2;37     *v2 = temp;38 }39 40 /* 交换的只是内部v1、v2的值41 void swap(int v1, int v2)42 {43     int temp = v1;44     v1 = v2;45     v2 = temp;46 }*/
 1 #include <stdio.h> 2 int sumAndMinus(int n1, int n2, int *n3); 3  4 int main() 5 { 6     int a = 10; 7     int b = 7; 8      9     // 存储和10     int he;11     // 存储差12     int cha;13     c14     he = sumAndMinus(a, b, &cha);15     16     printf("和是%d, 差是%d/n", he, cha);17     18     return 0;19 }20 21 // 返回值是22 int sumAndMinus(int n1, int n2, int *n3)23 {24     *n3 = n1 - n2;25     26     return n1 + n2;27 }

5.指针和数组

 1 #include <stdio.h> 2  3 /* 4  1.数组元素的访问方式 5  int ages[5]; 6  int *p; 7  p = ages; 8  1> 数组名[下标]  ages[i] 9  2> 指针变量名[下标] p[i]10  3> *(p + i)11  12  2.指针变量+1,地址值究竟加多少,取决于指针的类型13   int *   414   char *  115   double * 816  */17 void change(int array[]);18 19 int main()20 {21     // 20个字节22     int ages[5] = {10, 11, 19, 78, 67};23     24     change(ages);25     26     return 0;27 }28 29 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素30 void change(int *array)31 {32     printf("%d/n", array[2]);33     //printf("%d/n", *(array+2));34 }35 36 /*37 void change(int array[])38 {39     int s = sizeof(array);40     41     printf("%d/n", s);42 }*/43 44 void test()45 {46     double d = 10.8;47     double *dp;48     dp = &d;49     50     printf("dp = %p/n", dp);51     printf("dp + 1 = %p/n", dp + 1);52     53     int ages[5] = {10, 9, 8, 67, 56};54     55     int *p;56     // 指针变量p指向了数组的首元素57     p = &ages[0];58     // 数组名就是数组的地址,也是数组首元素的地址59     //p = ages;60     61     /*62      p ---> &ages[0]63      p + 1 ---> &ages[1]64      p + 2 ---> &ages[2]65      p + i ---> &ages[i]66      */67     68     //printf("%d/n",  *(p+2));69     70     printf("%d/n",  p[2]);71     72     /*73      for (int i = 0; i<5; i++) {74      printf("ages[%d] = %d/n", i, *(p+i));75      }*/76     77     78     //    printf("%p/n", p);79     //    printf("%p/n", p + 1);80     //    printf("%p/n", p + 2);81 }

6.指针和字符串

 1 #include <stdio.h> 2  3 /* 4  1.常量区 5  存放一些常量字符串 6   7  2.堆 8  对象 9  10  3.栈11  存放局部变量12  13  掌握:14  定义字符串的2种方式15  1> 利用数组16  char name[] = "itcast";17   * 特点:字符串里面的字符是可以修改的18   * 使用场合:字符串的内容需要经常修改19  20  2> 利用指针21   char *name = "itcast";22   * 特点:字符串其实是一个常量字符串,里面的字符是不能修改23   * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用24  */25 26 int main()27 {28     char name[20];29     30     printf("请输入姓名:/n");31     32     scanf("%s", name);33     34     // 'j' 'a' 'c' 'k' '/0'35     36     //printf("%c/n", name[3]);37     38     //printf("刚才输入的字符串是:%s/n", name);39     40     return 0;41 }42 43 // 定义字符串数组44 void test2()45 {46     char *name = "jack";47     48     //int ages[5];49     50     // 指针数组(字符串数组)51     char *names[5] = {"jack", "rose", "jake"};52     53     // 二维字符数组(字符串数组)54     char names2[2][10] = {"jack", "rose"};55 }56 57 // 定义字符串58 void test()59 {60     // 字符串变量61     char name[] = "it";62     name[0] = 'T';63     64     //printf("%s/n", name);65     66     67     // "it" == 'i' + 't' + '/0'68     // 指针变量name2指向了字符串的首字符69     70     // 字符串常量71     char *name2 = "it";72     73     char *name3 = "it";74     75     //*name2 = 'T';76     77     //printf("%c/n", *name2);78     79     printf("%p/n%p/n", name2, name3);80     81     //printf("%s/n", name2);82 }
 1 #include <stdio.h> 2 /* 3  (不包括/0) 4  编写一个int string_len(char *s),返回字符串s的字符长度 5   6  */ 7 int string_len(char *s); 8  9 int main()10 {11     //char *name = "itcast";12     13    // 男 /u434/u4343/u43414     15     int size = string_len("tre777");16     17     printf("%d/n", size);18     return 0;19 }20 21 int string_len(char *s)22 {23     // 1.定义一个新的指针变量指向首字符24     char *p = s;25     26     /*27     while ( *s != '/0' )28     {29         s++;30     }*/31     32     while ( *s++ ) ; 33     34     return s - p - 1;35 }36 37 /*38 int string_len(char *s)39 {40     // 记录字符的个数41     int count = 0;42     43     // 如果指针当前指向的字符不是'/0'44     // 首先*s取出指向的字符45     // 然后s++46     while ( *s++ )47     {48         // 个数+149         count++;50         51         // 让指针指向下一个字符52         //s = s + 1;53         //s++;54     }55     56     return count;57 }58 */59 60 /*61 int string_len(char *s)62 {63     // 记录字符的个数64     int count = 0;65     66     // 如果指针当前指向的字符不是'/0'67     while ( *s != '/0')68     {69         // 个数+170         count++;71         72         // 让指针指向下一个字符73         //s = s + 1;74         s++;75     }76     77     return count;78 }*/

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表