目录
前提说明:字符串在传参的时候,或者说作为一个表达式的时候,它的值是首字符的地址,它并不是把“abcdef”传给了my_strlen函数,而是把首字符'a'的地址传过去了,首字符'a'的地址是char类型的地址,需要一个char*的指针接收
#include<stdio.h>
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
//str++;//指针+整数
str = str + 1;
}
return count;
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}

思路:看str指向的那个字符是什么,不是‘\0’,计数器count++,指针str是一个char*的指针,+1跳过一个char类型的变量,最后当遇到'\0',返回count作为返回值。
#define N_VALUES 5 float values [ N_VALUES ]; float * vp ; // 指针 +- 整数;指针的关系运算 for ( vp = & values [ 0 ]; vp < & values [ N_VALUES ];) { * vp ++ = 0 ; }

指针- 指针 == 地址 - 地址
前提:
由前面我们可知指针+-整数是等于指针的,那如果指针 - 指针不就是整数了吗,分两种情况
1.大地址-小地址:随着数组下标的增长,地址是由低到高变化的
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = &arr[9] - &arr[0];
printf("%d\n", n);
return 0;
}
执行:

个人思路:把内存监视调出来:可以观察一下它们的地址

🍄实践证明:
用它们的地址相减:减出一个24,这个24是一个16进制数,可以代表它们之间相差的内存空间, 将16进制24转换为10进制后,是36byte也就是相差9个(整型)元素的地址空间
2.小地址 - 大地址(特殊情况)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = &arr[0] - &arr[9];
printf("%d\n", n);
return 0;
}

int my_strlen(char* str)
{
char* start = str;
while (*str!='\0')
{
str++;
}
return str - start;
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}
执行:

图解:

for ( vp = & values [ N_VALUES ]; vp > & values [ 0 ];) { *-- vp = 0 ; }
for ( vp = & values [ N_VALUES - 1 ]; vp >= & values [ 0 ]; vp -- ) { * vp = 0 ; }
关于这两种写法的理解:
关于野指针的知识:vp1:起始位置这不是越界了吗?没有。
🌵理解:
这个位置后面的空间虽然不属于values数组,但指向这个位置是没有形成越界访问的这种效果,仅仅指向是没有问题的!!!只有当对vp1解引用了或者说访问数组values[5]的元素了,通过vp1改数组values后面空间的数据了,那确实是非法访问了🌳
关于vp1和vp2指针问题:
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
二者区别:
指针就是指针,不是数组
数组就是数组,也不是指针
如何求大小:
指针的大小:4/8个字节,指针是存放地址的,地址的存放需要多大空间,指针变量的大小就是多少
数组的大小:取决数组的元素个数和每个元素的类型
我们看一个例子:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}

int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 }; int * p = arr ; //p 存放的是数组首元素的地址
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);
}
return 0;
}

循环部分的代码也可以写成:
for (i = 0; i < sz; i++)
{
printf("%d ", i[arr]);
//i[arr] -- *(i+arr)
//arr[i] -- *(arr+i)
}
💥注意的点:
三者等价:*(arr+i)-->*(p+i)-->arr[i]
不管是写成i[arr]还是arr[i],编译器都会转换成*(arr+i)或者*(i+arr)
所以 p+i 其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。
如下:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
//存放
for (i = 0; i < 10; i++)
{
*p = i + 1;
p++;
}
//打印
p = arr;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
存放的另一种写法:
for(i=0;i<10;i++)
{
*(p+i)=i+1;}
图解:

上述图解和代码证明了:
1.指针可以指向数组元素的
2.因为指针可以运算,所以借助于指针可以访问数组
int main()
{
int arr[3][5];
return 0;
}
等价的写法: 🚗
arr[i][j] --> (*(arr+i))[j] -->*(*(arr+i)+j)
#include<stdio.h>
int main()
{
int a = 10;//a是要在内存中申请4个字节的空间的
//一级指针
int* pa = &a;//0x0012ff40,pa是变量,用来存放地址,也得向内存申请,申请4/8
//二级指针
int** ppa = &pa;//0x0012ff48
//三级指针
int*** pppa = &ppa;
printf("%d\n", **ppa);
return 0;
}
✅✅注意:最右边的*间隔分开只是为了更好解释它是一个什么样的指针,空格加不加无所谓的
一级指针:
int* pa = &a; --> *表明pa是指针,而int表明pa指向的对象a的类型是int
二级指针:是用来存放一级指针变量的地址
int* * ppa = &pa --> *告诉我们ppa是指针,而int*表明ppa指向的对象pa的类型是int*
如此类推....
可以打开内存监视窗口看一下情况,各个变量的地址和生成的对应指针存放的地址是一样的
画图:

int b = 20 ; * ppa = & b ; // 等价于 pa = &b;
** ppa = 30 ; // 等价于 *pa = 30; // 等价于 a = 30;
还有一点:其实在开发的过程中三级指针很少用。
int arr1 [ 5 ]; char arr2 [ 6 ];
#include<stdio.h>
int main()
{
int* p;
int a = 10;
int b = 20;
int c = 30;
//指针数组--存放指针的数组
int* arr[] = { &a,&b,&c };//
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", *(arr[i]));
}
char* arr2[5];
float* arr3[5];
return 0;
}
执行:

▶️关于这里的知识点总结:

除此之外还有:
char* arr2[5];//存放字符指针数组
float* arr3[5];//存放浮点型指针的数组...等等数组
int main()
{
char* arr[5];//{char* char* char* char* char*}
char** p = arr;//&arr[0] - char**
return 0;
}

arr表示首元素的地址也就是&arr[0],我本以为它的类型在监视中是char**,结果是char*[5] -- 上图可知。
反思得:
其实首元素的地址:&arr[0]类型确实是char**,监视的时候是表示的是一个数组,监视的是数组类型而不是数组首元素地址的类型
原因:
监视窗口有自己的规则,这个不必深究
#include<stdio.h>
int main()
{ //
int arr1[] = { 1,2,3,4,5 };//数组arr1内部的元素是连续的,但是arr1,arr2,arr3三者不一定连续
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* ptr[] = { arr1,arr2,arr3};
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", ptr[i][j]);
}
printf("\n");
}
return 0;
}
注意:数组arr1的内部元素是连续的,但是arr1,arr2,arr3三者不一定连续
执行结果:

我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']