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

一、 指针的定义、赋值

1、定义格式:变量类型 *变量名;

char   *p(定义了一个指针变量p,且指针p只能指向char类型数据)

2、指针的特点,指针变量只能存储地址

3、指针的作用:能够根据一个地址值,访问对应的存储空间

4、指针的存储:任何指针都占8个字节的存储空间

5、指针的赋值:

①  先定义后赋值

1 int a = 10; 2 int *p; 3 p = &a;

②  定义的同时赋值

1 int a = 10; 2 int *p = &a;

③ 易错点

1 %p输出指针里面存储的地址值 2 不能乱用类型,比如int a = 10; float *p = &a;

6、指针清空

1     p = 0;
2     p = NULL;

二、指针的注意事项

 1 //代码举例
 2 //不建议的写法, int *p只能指向int类型的数据
 3     int *p;
 4     double d = 10.0;
 5     p = &d;
 6
 7     // 指针变量只能存储地址
 8     int *p;
 9     p = 200;
10
11
12     // 指针变量未经过初始化,不要拿来间接访问其他存储空间
13     int *p;
14     printf("%d\n", *p);
15
16
17
18
19     // 定义变量时的*仅仅是一个象征,没有其他特殊含义
20     int *p = &a;
21
22     // 不正确的写法
23     p = &a;
24
25     // 这个时候的*的作用:访问指向变量p指向的存储空间
26     *p = 20;

三、指针和数组

1、 指针对数组元素的访问方式

1  int ages[5];
2  int *p;
3  p = ages;

① 数组名[下标]  ages[i]

② 指针变量名[下标] p[i]

③ *(p + i)

2、 指针变量+1,地址值究竟加多少,取决于指针的类型

int *   4

char *  1

double * 8

3、数组与指针数据的传递

 1 //代码举例
 2 #include<stdio.h>
 3 void change(int array[]);
 4
 5 int main()
 6 {
 7     // 20个字节
 8     int ages[5] = {10, 11, 19, 78, 67};
 9
10     change(ages);
11
12     return 0;
13 }
14
15 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
16 void change(int *array)
17 {
18     printf("%d\n", array[2]);
19
20 }

4、用指针遍历整个数组

1 // 数组名就是数组的地址,也是数组首元素的地址
2      p = ages;
3
4      for (int i = 0; i<5; i++) {
5      printf("ages[%d] = %d\n", i, *(p+i));
6      }

四、 指针与字符串

1、定义字符串的两种方式

① 利用数组

char name[] = "gaizuojia";

* 特点:字符串里面的字符是可以修改的

* 使用场合:字符串的内容需要经常修改

②  利用指针

char *name = "gaizuojia";

* 特点:字符串其实是一个常量字符串,里面的字符是不能修改

* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

1  // 指针数组(字符串数组)
2     char *names[5] = {"jack", "rose", "jake"};
3
4     // 二维字符数组(字符串数组)
5     char names2[2][10] = {"jack", "rose"};

五、返回指针的函数

返回指针的函数的一般形式为:类型名  *函数名(参数列表)

 1 #include <stdio.h>
 2 char *names();
 3
 4
 5 int main()
 6 {
 7     char *name = test();
 8
 9     printf("name=%s\n", name);
10
11     return 0;
12 }
13
14 char *names()
15 {
16     return "gaizuojia";
17 }

六、 指向函数的指针

1、定义指向函数的指针

1  double (*p)(double, char *, int);
2
3         p = haha;

或者

double (*p)(double, char *, int) = haha;

2、如何间接调用函数

① p(10.7, "gaizuojia", 10);

② (*p)(10.7, "gaizuojia", 10);

3、有返回值函数指针的定义

1 // 定义指针变量指向sum函数
2     // 左边的int:指针变量p指向的函数返回int类型的数据
3     // 右边的(int, int):指针变量p指向的函数有2个int类型的形参
4     int (*p)(int, int);

4、 无返回值函数指针的定义

1 // (*p)是固定写法,代表指针变量p将来肯定是指向函数
2     // 左边的void:指针变量p指向的函数没有返回值
3     // 右边的():指针变量p指向的函数没有形参
4     void (*p)();
时间: 2024-12-06 08:35:02

黑马程序员——C语言——指针的相关文章

黑马程序员-c语言指针的学习

c语言的难点和精华部分就是指针,能够将指针完全理解并且将其运用熟练不是一件容易的事情,其中有几个知识点比较绕一些. 1.数组指针与指针数组的区别.  数组指针是一个指针,是指向数组的指针,就如同int*,char*型指针,只不过它是指向数组的(首元素),大小为4(32位平台下),通过它就可以做找到整个数组. 1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 int a[3][4] = {{0,1,2,4}, 5 {5,6

黑马程序员-C语言指针的使用

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 指针 指针变量就是用来存储地址的,占用8个字节 1.定义 类名标识符 *指针变量名 int *p 2.先定义后赋值 int a = 10; int *p; p = &a;  //p==10; 简单修改p 的值 *p=9; 或者在定义的同时赋值int *p = &a; 3.作用 根据一个地址值,访问存储空间 指针前面定义的类型表面指针只能指向该类型的数据 上面例子 ------------

黑马程序员——c语言学习心得—— 指针

黑马程序员——c语言学习心得—— 指针 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,打开文件fopen(文件名,打开方式);例如:FILE *fp = fopen("a1","r");  返回的是文件的指针(文件在内存缓冲区的首地址)fopen函数反回值 是指向 a1文件的指针,通常赋值给一个指针变量关于文件名a1 也可以是一个“路径+文件名”   c:\abc.txt----------------

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员_C语言总结-基础部分

C语言基础 1.C语言的关键字 1>关键字就是C语言提供的有特殊含义的符号,也称为保留字,C语言中一共有32个关键字,这些关键字都有自己的含义 例如:int double float if  else switch for 等等 2.标示符的概念: 1>标示符就是在程序中自定义的一些名称,比如函数名,变量名,结构体名等等这些都是标示符 2>命名规则: 1>只能由英文字母的大小写和数字以及_下划线组成,且首字母必须为字母或者下划线_ 2>在C语言中是严格区分大小写的,比如if是

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员——c语言学习心得——位运算符a

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h>void func(int n, char  str[ ][5] ){int i;for(i = 0; i < n; i++)  printf("/nstr[%d] = %s/n"

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输