• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C指针学习笔记

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
记得初学C语言时对C指针不是很了解,当时也没怎么在意,直到后来学了计算机结构,操作系统,对指针才有了进一步了解,其实指针并不是什么深奥的东西。下面就讲讲指针的用法。

首先,指针是一种数据类型,凡是数据类型都有对应的数据,而数据就要在内存里储存,就像int一般占4个字节,long占4个或8个,pointer类型一般占4个字节,这与他储存的数据有关,因为他储存的是地址,而计算机内存地址一般可用就是4GB,所以4个字节,2的32次方可以够用。
其实上面已经讲了,指针其实就是储存其他变量的地址,因为计算机根据地址来储存和接受数据,所以指针所储存的地址可应用来操作其他变量。看如下代码:

 

int a = 1000;

int* ptr = &a; 
cout 
<< &<< endl;

cout 
<< &ptr << endl;

cout 
<< ptr << endl;

cout 
<< *ptr << endl;


第二行先说ptr是int类型的指针,也就是说他储存的是int类型的变量的地址,&操作符是取地址操作符,他返回的是变量的地址,通过这一个赋值,这个指针变量的值就是a的地址。
假如我们有这样的代码:

 1int a = 1000
 2int* ptr = &a;
 3
 4cout << endl; 
 5cout << *ptr << endl;
 6
 7ptr++//这是干什么呢?
 8
 9
10cout << ptr << endl; 
11cout << *ptr << endl; 
12
其中弟7行是干什么呢?是把指针加1吗?并不是。他是把指针所储存的地址改变了,怎么改变呢?因为指针储存的是int类型的地址,int类型假如占4个byte的话,那么指针这时的值和原来就差4,什么意思呢?就是说指针指到了int后的地址,而这个地址储存的东西是不确定的,所以*ptr输出的东西不确定。
(注意你并不能通过ptr++和*ptr 把内存里所用的东西都打出来,有些内存不是你的程序允许access的)
 
指针和数组,字符串的关系。
首先要了解数组的储存方式,先说一维数组:



1int a[100];
是要100个连续的int类型的内存的空间,事实上a就是个指针, 他所储存的就是这100个int类型内存的第一个int的地址,就是a[0]的地址。你可以通过下面的证实这一点:




1int* ptr = a; //因为a本身是指针,不用ptr = &a
2//ptr = a 是把a的值,即&a[0] 的地址给ptr
3//如果写成ptr = &a, 就把a本身的地址给了ptr
4
5cout << a << endl; //打印a储存的内容
6cout << &a[0<< endl; //打印a[0]的地址
那么怎么得到a[1]呢? 只要把a中的地址加4就可以了,其他的也是这样得到的。
所以 函数参数假如是数组的话,只要个他第一个元素的地址就可以了,这也是为什么数组参数可以写成 f(int a[]) 也可以写成 f(int* a)的原因,这也是为什么在函数里可以改变数组元素值的原因,因为元素的改变都是通过地址改变的,而一般的参数只是把值拷贝而已。

下面说说二维数组



1int a[50][100];
这个语句将会使系统分配50 x 100 个int类型内存空间,因为内存本身是一维的,所以你调用a[2][10]时,系统会先数 100 x 2 个int内存,然后再数10个。
事实上假如保存了每个100个元素的第一个元素的地址这就简单多了。系统也是这么想的。看下面的语句:



1cout << a[0<< endl;
2cout << a[1<< endl;
看看他们差的是不是4 x 100, 所以前面的a[] 保存的是每100个元素的地址,一共需要这样的指针50个。
那么a是什么呢,这样想,要是这50个指针是连续的,那么把这50个指针第一个的地址保存了,那么其他的不是也可以通过递增得到吗?其实a保存的就是这50个指针中第一个指针的地址,a就是所谓的指针的指针,因为指针保存一般变量的地址,指针的指针保存了指针的地址, 看下面的语句:



1cout << a << endl;
2cout << &a[0<< endl;
看看他么是不是一样呢?

所以你可以这样写 a[10][10], 也可以这样写 *( *(a+10) + 10) 效果完全一样。
a+10 得到的是a[10] 的地址, *(a+10) 是他地址里的东西,这是第十行第一个元素的地址, *(a+10) + 10 是第十行第十个元素的地址,怎么得到他里面的东东呢?
*(*(a+10) + 10) 就行了。

你也可以这样 int (*b)[100] = a;
这样b和a的效果就一样了, 注意不要写成 int *b[100], 这样就成了100个int类型的指针了。

字符串也是数组,所以差不多, 只不过要写成:



1char str[] = "good boy";
2char* ptr = str;
方便之处就是可以写出这样简洁的语句:



1char str1[] = "good boy";
2char str2[] = "bad boy";
3
4char* ptr1 = str1;
5char* ptr2 = str2;
6
7while (*ptr1 != '\0' && *ptr2 != '\0')
8*ptr1++ = *ptr2++;
理解下吧 :-)

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C函数篇(OCI函数)发布时间:2022-07-14
下一篇:
C#中distinct的使用发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap