黑马程序员——C语言基础 指针
Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
(以下内容是对黑马苹果入学视频的个人知识点总结)
(一)指针
首先指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。
1)指针变量的定义
1>定义的格式
类名标识符 *指针变量名;
int *p;
指针需要先定义然后再赋值
简单取值
int a = 10;
int *p;
p = &a;
简单改值
*p = 9;
定义的时候赋值
int a = 10;
int *p = &a;
指针变量都占用8个字节的存储空间,它存储的时数据的地址
2>指针可以实现修改实参
不能交换外面实参的值,仅仅是交换了内部指针的指向
3>指针可以清空
p=NULL;清空后的指针是不能再间接访问其他存储空间
#include <stdio.h> int main()
{
/* 不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;*/ /* 指针变量只能存储地址
int *p;
p = 200;
*/ /* 指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
*/ int a = ;
/*
int a;
a = 10;
*/ /*
int *p;
p = &a;
*/
// 定义变量时的*仅仅是一个象征,没有其他特殊含义
int *p = &a; // 不正确的写法
// *p = &a;
p = &a; // 这个时候的*的作用:访问指向变量p指向的存储空间
*p = ; char c = 'A'; char *cp = &c; *cp = 'D'; printf("%c\n", c); return ;
}
(二)指针与数组
可以定义指向一维数组的指针,可以使用指针遍历数组的元素
#include <stdio.h> /*
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i) 2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
*/
void change(int array[]); int main()
{
// 20个字节
int ages[] = {, , , , }; change(ages); return ;
} // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
void change(int *array)
{
printf("%d\n", array[]);
//printf("%d\n", *(array+2));
} /*
void change(int array[])
{
int s = sizeof(array); printf("%d\n", s);
}*/ void test()
{
double d = 10.8;
double *dp;
dp = &d; printf("dp = %p\n", dp);
printf("dp + 1 = %p\n", dp + ); int ages[] = {, , , , }; int *p;
// 指针变量p指向了数组的首元素
p = &ages[];
// 数组名就是数组的地址,也是数组首元素的地址
//p = ages; /*
p ---> &ages[0]
p + 1 ---> &ages[1]
p + 2 ---> &ages[2]
p + i ---> &ages[i]
*/ //printf("%d\n", *(p+2)); printf("%d\n", p[]); /*
for (int i = 0; i<5; i++) {
printf("ages[%d] = %d\n", i, *(p+i));
}*/ // printf("%p\n", p);
// printf("%p\n", p + 1);
// printf("%p\n", p + 2);
}
(三)指针与字符串
定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
#include <stdio.h> int main()
{
char name[]; printf("请输入姓名:\n"); scanf("%s", name); // 'j' 'a' 'c' 'k' '\0' //printf("%c\n", name[3]); //printf("刚才输入的字符串是:%s\n", name); return ;
} // 定义字符串数组
void test2()
{
char *name = "jack"; //int ages[5]; // 指针数组(字符串数组)
char *names[] = {"jack", "rose", "jake"}; // 二维字符数组(字符串数组)
char names2[][] = {"jack", "rose"};
} // 定义字符串
void test()
{
// 字符串变量
char name[] = "it";
name[] = 'T'; //printf("%s\n", name); // "it" == 'i' + 't' + '\0'
// 指针变量name2指向了字符串的首字符 // 字符串常量
char *name2 = "it"; char *name3 = "it"; //*name2 = 'T'; //printf("%c\n", *name2); printf("%p\n%p\n", name2, name3); //printf("%s\n", name2);
}
(四)指向函数的指针
指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
double (*p)(double, char *, int);
p = haha;或者 double (*p)(double, char *, int) = haha;
3.如何间接调用函数
1> p(10.7, "jack", 10);
2> (*p)(10.7, "jack", 10);
1>由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
2>指向函数的指针只要有两个用途:
①调用函数
②将函数作为参数在函数间传送
黑马程序员——C语言基础 指针的更多相关文章
- 黑马程序员——C语言基础语法 关键字 标识符 注释 数据及数据类型
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)C语言简单介绍 (1)C语言程序是由函数组成的任何C语言程序都是由一 ...
- 黑马程序员——OC语言基础语法 面向对象的思想
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...
- 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...
- 黑马程序员——C语言基础 函数
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)函数的定义 1> 任何一个C语言程序都是由一个或者多个程序段( ...
- 黑马程序员——C语言基础 char字符 数组
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)char类型 1)存储细节 ASCII单字节表(双字节GBK\GB2 ...
- 黑马程序员——C语言基础 scanf函数 基本运算 三目运算符
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)scanf函数 1> 简单介绍一下scanf函数 这是在 ...
- 黑马程序员——C语言基础 变量类型 结构体
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)变量类型 1)局部变量 1> 定义:在函数内部定义的变量,称为 ...
- 黑马程序员——C语言基础 流程控制 选择结构和循环结构
---恢复内容开始--- Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)流程控制 1> 顺序结构:默认的流程 ...
- 黑马程序员——C语言基础 字符串
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)字符串 1>字符串是由多个字符组合在一起形成的 2>初始 ...
随机推荐
- Asp.Net 一个请求的处理流程
1.浏览器请求 请求-准备环境-->处理请求 2.Aspnet 环境的创建 客户请求 IIS区分静态文件还是动态文件,静态文件直接文件返回,动态文件通过aspnet_isapi.dll进行处 ...
- myeclipse连接oracle步骤
1.加载ojdbc.jar驱动(路径:E:\myoracle\oracle\product\11.2.0\dbhome_1\jdbc\lib) 2.String url = "jdbc:or ...
- 转:最近5年133个Java面试问题列表
最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...
- 121. Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- 用到的一些python包,记录下
Requests beautifulsoup lxml logging gevent django Bottle numpy pandas sklearn pyopencv opencv_python ...
- Oracle之常见问题诊断方法
Oracle认证:常见问题诊断方法如下: 1.TNS-12154 Error 或ORA-12154 特征:SQL*NET没有找到连接串或别名 原因1:(1)没有找到TNSNAMES.ORA文件,该文件 ...
- CSS3 选择器——基本选择器
CSS的选择器,我想大家并不会陌生吧,因为天天在使用,但对于CSS3的选择器,要运用的灵活到位,我想对很多朋友还是一定的难度,特别是CSS3中的:nth选择器.那么从现在开始我们先丢开他们版本的区别, ...
- Response.Write("<script>alert('弹出对话框!')</script>") 后跟Response.Redirect("page.aspx");不能弹出对话框,直接跳转页面了 如何解?
Response.Write和Response.Redirect一起用的时候就会这样,write脚本和redirect脚本不能同时使用,这样不会执行脚本,最好使用ClientScript 改进方法: ...
- JDBC/PreparedStatement
JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力 JDBC AP 是Sun公司提供的I 内容:供程序员调用的接口,集成在Java.sql和javax.sql包中, 如 ...
- Python 小练习
输出标题以及长度 结果 输出网页下方学校地理位置以及 输出"abcdefg"base64编码 输出网页内容的MD5 hash