//格式:变量类型 *变量名
//定义了一个指针变量p
//指针变量只能存储地址
//指针就一个作用:能够根据一个地址值,访问对应的存储空间
//指针变量p前面的int;指针变量p只能指向int类型的数据
int *p;

int a = 90;

//指针变量p指向了变量a
p = &a;

*p = 10;

a = 20;

printf("%d\n", *p);
//printf("%d\n", a);

return 0;

//利用指针修改
int main()
{
    int a = 90;

change(&a);

prinf ("%d\n", a);
    
    return 0;
}
void change(int *n)//int *n = &a;
{
    *n = 10;//将10赋给地址&a
}

格式: 变量类型  *变量名

定义一个指针变量p

int *p;

int a = 90;//分配存储空间给a

p里面只能存地址

p = &a;//指针变量p指向了变量a

以上三行代码在内存中

通过指针改变a 的值

*p = 10;

定义变量时的*仅仅是一个象征,没有其他特殊含义

利用指针求两个数的和与差

#include <stdio.h>

int main()
{
int a = ;
int b = ; int sum;
int min; sum = sumAndMinus(a, b, &cha); printf ("和是%d, 差是%d\n", he, cha);
return ;
} int sumAndMinus(int n1, int n2, int *n3)
{
*n3 = n1 - n2; return n1 + n2;//指针作用:使函数返回值可以有多个
}

任何指针都占用8个字节的存储空间

 #include <stdio.h>

 int main()
{
// 0000 0000 0000 0000 0000 0000 0000 0010
int i = ;
// 0000 0001
char c = ; int *p;
p = &c; printf("c的值是%d\n", *p); return ;
}
/*输出:
c的值是513
*/
//使用 int *p 不是 1 而是 513
//原因:int *p 取值赋值时 取赋4个字节内容
// 而 char *p 取值赋值时 取赋一个字节内容
//所以 指针都为8个字节存储空间,却定义指针类型的原因是,取值赋值相对应的类型的存储空间

 *p地址为(从大到小)0000 0000 0000 0000 0000 0010 0000 0001        int值为513

指针与数组:

 #include <stdio.h>

 int main()
{
int ages[] = {, , , , };
int *p; p = &ages[];//指针变量p指向了数组的首元素
//数组名就是数组的地址,也是数组首元素的地址
//p = ages;
//p + 1 的地址取决于指针p的类型 p为int p + 1 地址则增加 4
/*所以:
p + 1 -> &ages[1]
p + 2 -> &ages[2]
p + i -> &ages[i]
*/
/*
用指针 遍历数组:
for (int i = 0; i<5; i++)
{
printf("ages[%d] = %d\n", i, *(p+i));
}
*/
return ;
}
#include <stdio.h>

void change(int array[]);
int main()
{
int ages[] = {, , , , }; change(&ages[]); return ;
} void change(int *array)
{
printf("%d\n", array[]);
} //输出结果: 67

指针与字符串:

定义字符串的两种方式 1》利用数组

            char *name = "it";//字符串里面的字符是可以修改的

           2》利用指针

            char *name = "it";//字符串其实是常量字符串,字符不能改

             适用场合: 不需要修改且经常用到

1,常量区

2, 堆

    对象

3, 栈

    存放局部变量

使用char name[] = "it";为字符创变量

   char *name = "it";为字符串常量//不能改变值

返回指针的函数

 #include <stdio.h>

 char *test();

 int main()
{
char *name = test();//将函数的返回值赋值给指针 printf("name=%s\n", name); return ;
} char *test()
{
return "rose";
}

指向指针的函数:

  

 #include <stdio.h>

 void test()
{
printf("调用了test函数\n")
} int main()
{ /*
(*p)是固定写法,代表指针变量p将来肯定是指向函数
左边void :指针变量p指向的函数没有返回值
右边():指针变量p指向的函数没有形参
*/
void (*p)(); p = test;//指针变量p指向了test函数 (*p)();//利用指针变量简介调用函数 test();//直接调用函数
p();//简洁写法 }

C-指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. d3-画雷达图-圆形弧线

    本文转载 终极效果 源码 index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Co ...

  2. APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

    APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了 彻底理解android中的内部存储与外部存储 存储在内部还是外部 所有的Android设备均有两个文件存储区域:"intern ...

  3. wamp 中如何管理两个dedeCms站点

    本文以WampServer2.1为例,图文说明开启wamp虚拟主机功能,也就是绑定多域名,开启多站点搭建功能. 1.  我们一键安装wamp到E盘,并可以正常启动,状态如下图所示:  

  4. jquery $.each 和for怎么跳出循环终止本次循环

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each则对应的使用return true 和return false. ...

  5. 【caffe】mnist训练日志

    @tags caffe 前面根据train_lenet.sh改写了train_lenet.py后,在根目录下执行它,得到一系列输出,内容如下: I1013 10:05:16.721294 1684 c ...

  6. 一次更愚蠢的NOIP模拟赛

    都可以从COGS上找到 纵横字谜(krizaljka) 时间限制: 1 Sec  内存限制: 32 MB 题目描述 给出两个单词,找到第一个相同的字母,然后第一个单词横数输出,第二个竖着输出形成十字形 ...

  7. Windows批处理以服务的方式启动解决思路(ShadowsockR注册成Windows Service)

    我以ShadowsockR的server启动来解释: 由于这东西是python,如果要启动,可以写一个批处理(python.exe server.py)来启动,但是我观察发现启动的时候是附带pytho ...

  8. POJ2456 Aggressive cows

    Aggressive cows 二分,关键是转化为二分! #include <cstdio> #include <algorithm> ; ; int N, C; int a[ ...

  9. 使用IDEA进行远程调试

    虽然很早以前就只有Eclipse和IDEA都支持远程调试功能的,但是基本没怎么使用过,今天因为紧急处理一个问题,而本地环境搭建起来比较麻烦,所以就使用了IDEA的远程调试功能.因此写一篇文章记录一下. ...

  10. [Android] View.setTag(key,Object) (java.lang.IllegalArgumentException: The key must be an application-specific resource id.)

    转自: http://blog.csdn.net/brokge/article/details/8536906 setTag是android的view类中很有用的一个方法,可以用它来给空间附加一些信息 ...