11-C语言指针
目录:
一、指针
1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址。
2 保存指针的变量,就叫指针变量,(保存地址)
3 声明一个指针变量
int i = 0;
int* p;//声明一个指针变量 int*指针类型
int * p; int* p; int *p;//这几种写法都行
4 每个指针变量能指向一种特定类型的对象。
5 指针是引用数据类型,因为本身没有保存最终数据,只是保存了数据的地址,间接的找到内存中的数据。
6 指针的用法
指针可用于参数,传递变量的地址,相当于多个函数共享内存地址(内存空间)。
7 值传递:相当于不同变量,指向不同区域
地址传递:相当于同一变量,指向同一区域
p:指针的值 &i:取i的地址
*p:指针指向的值 i:变量名
练习:
1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。
2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。
指针也可以做为返回值,但不要返回自动变量。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。
3)指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。
#include <stdio.h> //指针的基本使用
void test(){
int i = ;
//声明指针
int* p;
//int * p2;
//int *p3;
//赋值
p = &i;
//取值
printf("i val: %d\n",i);
printf("i address: %p\n",&i);
printf("p val: %d\n",*p);//*p指针指向的值
printf("p address: %p\n",p);//p是指针的值
} //指针可用于参数,传递变量的地址;
void test2(int* p){
printf("p->val:%d\n",*p);
*p = ;
printf("p->val:%d\n",*p);
} //练习:1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。
void test3(int* p1,int* p2){
printf("p1->%d,p2->%d\n",*p1,*p2);
int temp = ;
temp = *p1;
*p1 = *p2;
*p2 = temp;
printf("p1->%d,p2->%d\n",*p1,*p2);
} //2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。
void test4(int size,int array[],int* maxp,int* minp){
for (int i = ; i < size; i++) {
if (array[i] > *maxp) {
*maxp = array[i];
}
if (array[i] < *minp) {
*minp = array[i];
}
}
} //指针也可以做为返回值,但不要返回自动变量(局部变量)。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。解决方案,增长生命周期。
int* test5(){
static int i = ;
int* p = &i;
return p;
} //指针支持加整数、减整数
void test6(){
int array[] = {,,,,};
printf("array address:%p\n",array);
int* p = array;
printf("p address:%p\n",p);
printf("p->val:%d\n\n",*p);
//指针+1 地址+4
printf("p+1 address:%p\n",p+);
printf("p+1->val:%d\n",*(p+));
//
printf("\n*(p+1)->val:%d\n",*(p+));
printf("(*p)+1->val:%d\n\n",(*p)+);
//遍历数组
for (int i = ; i < ; i++) {
printf("p+%d->val:%d\n",i,*(p+i));
printf("array[%d]:%d\n",i,array[i]);
printf("array+%d:%d\n\n",i,*(array+i));
}
//存储空间
printf("array size:%ld\n",sizeof(array));
printf("p size:%ld\n",sizeof(p));
//赋值
int array2[] = {};
int* p2 = array2;
printf("\np address:%p\n",p);
p = p2;
printf("p address:%p\n",p); }
int main(int argc, const char * argv[])
{
test6(); // int* p = test5();
// printf("p:%p\n",p);
// printf("p->val:%d\n",*p); // test(); // int i = 10;
// int* p = &i;
// printf("i val:%d\n",i);
// test2(p);
// printf("i val:%d\n",i); // int i = 2;
// int j = 3;
// int* p1 = &i;
// int* p2 = &j;
// printf("i:%d,j:%d\n",i,j);
// test3(p1,p2);
// printf("i:%d,j:%d\n",i,j); // int num[5] = {0};
// int max = 0,min = 100;
// for (int i = 0; i < 5; i++) {
// printf("输入第%d个数:\n",i);
// scanf("%d",&num[i]);
// }
// test4(5,num,&max,&min);
// printf("max:%d\n",max);
// printf("min:%d\n",min);
return ;
}
二、指针与数组
1 占用空间
数组占用空间 = 数组元素占用空间*长度
指针占用空间 = 在64位系统下,固定8个字节,与指针类型无关。
2 赋值
数组是不可以修改其值,指针可以多次赋值。
作业:
1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。
2)使用函数交换两个值,在main函数中输出结果。
3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。
4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。
#include <stdio.h>
/*
1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。
*/
void test1(int length,int num[],int* sum,int* cha,int* ji,int* shang){
for (int i = ; i < length; i++) {
*sum += num[i];
*cha -= num[i];
*ji *= num[i];
*shang /= num[i];
}
}
/*
2)使用函数交换两个值,在main函数中输出结果。
*/
void test2(int* p1,int* p2){
int temp = ;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
/*
3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。
*/
void test3(int miaoshu,int* h,int* minute,int* miao){
*h = miaoshu / ;
*minute = miaoshu % / ;
*miao = miaoshu % ;
}
/*
4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。
*/
int* test4(int length,int num[]){
static int max = ;
int* p = &max;
for (int i = ; i < length; i++) {
if (num[i] > max) {
*p = num[i];
}
}
return p;
}
int main(int argc, const char * argv[])
{
int num[];
for (int i =; i < ; i++) {
printf("输入第%d个数:",i+);
scanf("%d",&num[i]);
}
int* p1 = test4(,num);
printf("最大值:%d\n",*p1); // int miaoshu,hour,minute,miao;
// printf("输入秒数:");
// scanf("%d",&miaoshu);
// test3(miaoshu,&hour,&minute,&miao);
// printf("%d时%d分%d秒\n",hour,minute,miao); // int i = 2;
// int j = 3;
// test2(&i,&j);
// printf("i:%d,j:%d\n",i,j); // int num[5];
// int sum = 0,cha = 0,ji = 1,shang = 1;
// int length = 5;
// for (int i =0; i < 5; i++) {
// printf("输入第%d个数:",i+1);
// scanf("%d",&num[i]);
// }
// test1(length,num,&sum,&cha,&ji,&shang);
// printf("和:%d\n",sum);
// printf("差:%d\n",cha);
// printf("积:%d\n",ji);
// printf("商:%d\n",shang);
return ;
}
11-C语言指针的更多相关文章
- c语言指针疑惑[转载]
c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- C语言指针【转】
一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...
- 关于C语言指针的一些新认识(1)
Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...
- C++11 shared_ptr智能指针(超级详细)
在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃.程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的.比如: 有些内存资源已经被释放,但指向它的指针并没 ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- C语言指针学习
C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...
随机推荐
- 【MongoDB数据库】MongoDB 命令入门初探
MongoDB是一款NoSql数据库,使用了"面向集合"(Collection-Oriented)原理,意思是数据被分组存储在数据集中,被称为一个集合(Collection).每一 ...
- .net网站开发(前端):4.MVC HtmlHelper
通过前面三节,已经大概理解MVC是怎样运作的了.MVC的一个特点就是可以很方便地控制视图效果,数据交互也很灵活.先讲一下视图控制的,HtmlHelper,看到Help就知道它是不知疲惫的好人啦(有点像 ...
- 利用CSS3特性巧妙实现漂亮的DIV箭头
DIV箭头用于表现DIV内容的指向,是使用非常普遍的一种表现形式,例如新浪微博的消息转发: 还有傲游网站的导航条: 像傲游账户上方这种箭头更需要多幅图片以表现箭头和hover的效果. 传统的实现方式都 ...
- 我使用过的Linux命令
我使用过的Linux命令之tee - 重定向输出到多个文件 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出 ...
- nginx args
$args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie ...
- linux杂记(?)命令别名——alias
linux中的命令别名--alias linux中的命令别名--alias 1. 用命令alias可以查询系统中有哪些可用的命令别名 2.添加命令别名 回车查看, 别名建立成功 3.查询命令的地址ty ...
- web server服务器
使用最多的 web server服务器软件有两个:微软的信息服务器(iis),和Apache. 通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序 ...
- codeforces 632E. Thief in a Shop fft
题目链接 E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input stan ...
- [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round
Problem It’s opening night at the opera, and your friend is the prima donna (the lead female singer) ...
- Mysql innodb 后台的7大线程与3大内存
A:一个master 线程(innodb 几乎在这个线程上实现有所有功能) B:一个lock 监控线程 C:一个错误监控线程 D:四个IO线程(insert buffer thread\log thr ...