在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
首先,指针是一种数据类型,凡是数据类型都有对应的数据,而数据就要在内存里储存,就像int一般占4个字节,long占4个或8个,pointer类型一般占4个字节,这与他储存的数据有关,因为他储存的是地址,而计算机内存地址一般可用就是4GB,所以4个字节,2的32次方可以够用。 其实上面已经讲了,指针其实就是储存其他变量的地址,因为计算机根据地址来储存和接受数据,所以指针所储存的地址可应用来操作其他变量。看如下代码:
int a = 1000;
int* ptr = &a; cout << &a << 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 那么怎么得到a[1]呢? 只要把a中的地址加4就可以了,其他的也是这样得到的。2//ptr = a 是把a的值,即&a[0] 的地址给ptr 3//如果写成ptr = &a, 就把a本身的地址给了ptr 4 5cout << a << endl; //打印a储存的内容 6cout << &a[0] << endl; //打印a[0]的地址 所以 函数参数假如是数组的话,只要个他第一个元素的地址就可以了,这也是为什么数组参数可以写成 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; 看看他们差的是不是4 x 100, 所以前面的a[] 保存的是每100个元素的地址,一共需要这样的指针50个。2cout << a[1] << endl; 那么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++; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论