黑马程序员——C语言学习笔记05 指针

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


1、指针变量只能存储地址。指针就一个作用,能够根据地址值访问对应的存储空间。

2、定义指针 int *p;

3、给指针赋值 p =#

4、访问并修改指针变量p指向的存储空间*p = 1;

 

5、不同类型的指针变量所占内存空间的大小都是8个字节。

 

6、当指针指向一个数组,那么这个指针*(p + i)就是去取出这个数组的第i个值。

指针 + 1 不是里面的值 + 1,而是地址 + 一个指针指向的元素的类型地址长度。

把地址加上i ,就代表这个指针指向第i个元素,因为首地址和第i个元素相差“i 乘以这个元素类型的字节数”个字节。

int类型是4个字节,这里加1就是加4个字节的地址,获取下一个元素的地址。

如果是char类型,p + 1 就是加一个字节的地址。获取下一个元素的地址。

 

这里不能使*p + i这个代表取出 p指向的存储空间的值在加上数值i

 

指针还可以像一个数组一样来取值,p指向数组 a[10]; p[2] ==a[2];

7、数组名就是这个数组的指针也就是数组第一个元素的指针

数组ages[10];

ages == &ages[0];

 

8、数组作为函数参数时有两个写法

数组int a[10];

void test(int a[]);

void test(int *a);

调用时

test(a);

所以,在函数中无法用sizeof来判断这个数组多大。因为它在函数中

判断的只是指针a的字节数,永远是8

 

9char a[] = "123";   char *a = "123"; 这两个字符串有很大的区别,前面的可以修改值,后面的不可以。

常量区:存放一些常量

堆:对象

栈:局部变量

char a[]是存在栈中的,随便修改。这个称作字符串变量

char *a是存放在常量区,这个是字符串常量。

 

例如

char *str1 ="abc";

char *str2 = "abc";

printf("%p\n%p\n",str1,str2);

输出结果相同,因为abc存放在常量区,第一次定义了就存放到常量区了,第二次用它还是它。不用在另外在开辟存储空间。

 

10、存放整型变量的叫整型数组 inta[10]; 数组里面存放的是整型数据

存放指针的数组叫指针数组char*name[10]; 数组里存放的是char指针

char *name[5] ={"jack", "rose", "jake"};

name[0]就是取出 数组元素0位置的指针,%s输出 name[0]就是jack

 

char *name[2] = {"tom","jack"};指针数组

char name[2][10] ={"tom", "jack"};二维字符串数组

 

11,经过910两项,总结出,如果要进行字符串输入并且储存,要用数组。不能用指针。

 

12、函数的返回值是指针

char *test()

{

return "haha";

}

调用

char *str = test();

printf("%s",str);

结果为haha

 

13、指向函数的指针

首先是书写格式

整型指针int *p;

函数返回值 (*p)(形参);  (*p)是固定写法。

p = 函数名;    p指向函数的地址。

 

void test()

{

printf("aa");

}

 

定义一个指向test的指针

void (*p)();

p = test;

或者

void (*p)() = test;

 

整型指针 int *p =&a;

指向函数的指针 void (*p)()= test;

取出指针指向控件的值 *p

调用函数 (*p)();        (*p)相当于先取出这个函数,然后后面的()就是调用了函数。

 

		#include <stdio.h>
		
		void test(){
		    printf("调用test函数\n");
		}
		
		int  test2(int num1,int num2)
		{
		    return num1 + num2;
		}
		
		char *test3()
		{
		    return "调用了test3函数\n";
		}
		
		
		int main()
		{
		    //定义一个指向test函数的指针
		    void (*p)() = test;
		    //定义一个指向test2函数的指针
		    int (*p2)(int, int) = test2;
		    
		    //定义一个指向test3的函数的指针
		    char *(*p3)() = test3;
		    
		    //调用test函数的方法1
		    (*p)();
		    //调用test函数的方法2
		    p();
		    //调用test函数的方法3
		    test();
		    
		    int n1 = 10;
		    int n2 = 2;
		    int sum;
		    int sum2;
		    int sum3;
		    //调用test2的方法1
		    sum = (*p2)(n1,n2);
		    printf("%d\n",sum);
		    //调用test2的方法2
		    sum2 = p2(n1,n2);
		    printf("%d\n",sum2);
		    //方法3
		    sum3 = test2(n1,n2);
		    
		    //调用test3方法1
		    printf("%s",p3());
		    //调用test3方法2
		    printf("%s",(*p3)());
		    //调用test3方法3
		    printf("%s",test3());
		    return 0;
		}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值