黑马程序员——C语言指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、指针

1.在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。
2.指针的重要性:指针是C语言的精华,它是用来存放变量的地址的,而且我们可以通过指针来直接操作变量,因此学好指针对以后C语言的深入研究有很大的帮助。
3.指针的使用
#include <stdio.h>
    int main(){
        int a = 10;
        int *p; // 定义一个指针变量
        p = &a; // 指针变量保存 a 的内存地址
        printf("%d\n",*p); // 通过内存地址访问变量 *代表取出该地址中存储的内容
         
        p = 0;
        p = NULL; // 清空指针操作
        return 0;
    }
上面程序定义一个指针,且让指针指向a的内存地址。
4.指针变量: 
a.作用:只能存放地址(指针变量占用8个字节存储空间),能够根据地址值访问存储空间,并修改存储空间的值。
b. *p代表访问p的存储空间(p是指针 )
c.p=&a;//代表指针p存储变量的a地址  指针变量p指向a
d. 指针变量的大小与其类型无关
#include <stdio.h>
    int main(){
        int a = 10; // int 类型为4个字节
        int *p = &a; 
         
        long b = 10; //long 类型为8个字节
        long *p2 = &b;
         
        printf("int 类型 指针变量的大小为 : %ld\n", sizeof p); // 64位编译器打印结果为8
         
        printf("long 类型 指针变量的大小为 : %ld\n", sizeof p2); // 64位编译器打印结果为8
        return 0;
    }
5.指针变量的分类: 指针变量的类型就告诉指针一次访问要取出该内存地址开始多少个字节
<span style="font-size:12px;">#include <stdio.h>
    int main(){
        int a = 10; // int 类型为4个字节  a 的地址: 0x7fff5fbff918 , 指针所存储的地址: 0x7fff5fbff918
        long b = 10; //long 类型为8个字节  b 的地址: 0x7fff5fbff910 , 指针所存储的地址: 0x7fff5fbff910
        /*
            按照内存寻址的原则我们可以知道a的地址比b的地址多4个字节 = 8位
        */
         
        int *p = &a; 
        long *p2 = &b;
         
        printf("a 的地址: %p , 指针所存储的地址: %p\n",&a,p);
         
        printf("b 的地址: %p , 指针所存储的地址: %p\n",&b,p2);
         
        printf("int类型指针一次访问所取出内容大小为 : %ld\n", sizeof *p); // int类型指针一次访问所取出内容大小为 : 4
         
        printf("long 类型指针一次访问所取出内容大小为 : %ld\n", sizeof *p2); // long 类型指针一次访问所取出内容大小为 : 8 
        return 0;
    }</span><span style="font-size:18px;">
</span>

二、指针与数组

1.在数组中规定 : 数组名是指向该数组的首地址,那么数组名就相当于一个指针,因此我们完全可以使用指针来遍历访问数组各个元素。
例如:
#include <stdio.h>
int main(){
    int array[3] = {1,2,3};
    int *p = array;
    for (int i =0 ; i < 3 ; i++){
        printf("array[%d] = %d \n",i,*(p+i)); // *(p+i) 先取出对应位置地址再访问
    }
    return 0;
}
运行结果为:
可以看到指针标识了数组的每个元素。
2.可以看到标识的规律
p-->&array[0]
p+1 -->&array[1]
p+2 -->&array[2]
p+i -->&array[i]

三、指针与字符串

1.字符串本身是字符数组
2.字符串定义的两种方式:
a.利用数组定义:
char name[]="itcat";
b.利用指针:
 char *name="itcast";
3.访问字符串要注意字符串的结束标志和长度防止访问了一块不可用的内存。
 #include <stdio.h>
    #include <string.h>
    int main(){
        char str[] = {'h','e','l','l','o','\0'};   // 等价于 char str[] = "hello";
        int len = strlen(str);
        char *p = str;
        for(int i = 0; i< len ; i++){
            // printf("str[%d] == %c",i,*(p+i));
            printf("str[%d] == %c\n",i,p[i]); // 等价于 printf("str[%d] == %c\n",i,*(p+i));
        }
        return 0;
    }
4.经常出现的错误
a.因为a是个常量,且值是指向a[0]的地址的存储空间值,无法进行修改。
char a[6];  
<span style="white-space:pre">	</span>a="asd"; 
b. 指针p的返回值是char型,只能赋值字符型并且char *p="asd"; 代表定义的是字符串常量,常量不能被更改。
char *p="asd";  
         *p="ddd"; 

四、指针与函数

1.函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2.指向函数的指针的定义
 定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3.指向函数的指针变量主要有两个用途:
a.调用函数。b. 将函数作为参数在函数间传递
#include <stdio.h>
        typedef int (*sum)(int,int);
        void test(sum s,int a,int b){
            int result = s(a,b); //利用函数指针调用函数 打印结果 : 1 + 1 = 2
            printf("%d + %d = %d",a,b,result);
        }
        int add(int a,int b){
            return a+b;
        }
        int main(){
            sum s = add; // 定义一个函数指针
            test(s,1,1);    //把函数指针作为参数传递
            return 0;
        }

五、总结与心得

1.指针作为C语言的精华用来存放变量的地址的,而且可以通过指针来直接操作变量。
2.清空指针:a.p=0;b.p=null。
3.数组指针与指针数组
a.指针数组是指针的数组,里边的内容是指针;
b.数组指针是指向数组的指针,具体一点是指向数组的第一个元素,指针每加一便指向数组的下一个元素。
4.数组,函数,字符串都与指针有密切的关系,可以通过指针进行一系列的操作。
5.int const *p 和 int *const p的区别
int const *p : a.const修饰的是*p,因此*p 是常量,不能通过*p 修改p所指向的存储空间的值
  b.P是变量,可以被赋值,p所指向的地址可以变化。
int *const p:a.是常量,其所指向的地址不能变化。
  b.*p 是变量,其所指向的存储空间的值可以变化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值