lameonde lameonde
关注数: 44 粉丝数: 66 发帖数: 5,205 关注贴吧数: 47
几行代码演示char*指针的含义 前面贴了一篇演示指针用法,其实不能叫用法,应该是含义。主要是数组与指针的关系和各种表达方式的含义。 字符串数组(C-风格字符串)、string和指针稍有不同,特别是使用cout输出时:传递首字符地址将打印整个字符串,显示地址要强制转换为int*。也就是说,不用把整个字符串传递给cout对象。运行结果见楼下。 #include <iostream> #include <string> using namespace std; int main() { char animal[20] {"bear"};//声明一个字符串数组并初始化 const char * bird {"wren"};//声明一个字符串指针并使用字符串常量初始化 string str {"rabbit"};//声明一个string变量并初始化 char (*pas)[20] = &animal;//声明一个指向整个字符串数组的指针 //显示一下生命的变量,对照着好看 cout <<"Creat these variables: \n"; cout << "char animal[20] {\"bear\"};\n"; cout << "const char * bird {\"wren\"};\n"; cout << "string str {\"rabbit\"};\n"; cout << "char (*pas)[20] = &animal;\n"; //以下显示数组和指针字符串中的单个字符 cout << "\nDisplay a single element of array or pointer to string: \n"; cout << "*animal = " << *animal << endl;//数组名使用指针表示法访问第1个字符 cout << "animal[0] = " << animal[0] << endl;//数组名采用数组表示法访问第1个字符 cout << "*(&animal[0]) = " << *(&animal[0]) << endl;//获取第一个元素的地址,解除引用 cout << "*bird = " << *bird << endl;//指针解除引用访问第1个字符 cout << "bird[0] = " << bird[0] << endl;//指针使用数组表示法访问第1个字符 cout << "*(&bird[0]) = " << *(&bird[0]) << endl;//指针使用数组表示法获取第一个元素地址,再解除引用 cout << "str[0] = " << str[0] << endl;//string变量使用数组表示法获取第一个元素值 //cout << "*str = " << *str << endl;string变量名可以作为数组名访问字符,但不能作为指针访问 cout << "*(&str[0]) = " << *(&str[0]) << endl; cout << "(*pas)[0] = " << (*pas)[0] << endl;//通过整个数组的指针获取第一个元素值 //以下显示整个数组和指针字符串:传递第一个元素地址、 cout << "\nDisplay the whole string:\n"; cout << "animal = " << animal << endl;//使用数组名显示字符串,实际是传递第一个元素地址 cout << "&animal[0] = " << &animal[0] << endl;//传递第一个元素的地址显示字符串 cout << "*(&animal) = " << *(&animal) << endl;//对整个数组地址解除引用,能够显示字符串 cout << "bird = " << bird << endl;//使用指针传递第一个元素的地址显示字符串 cout << "&bird[0] = " << &bird[0] << endl;//指针使用数组表示法传递第一个元素地址显示字符串 cout << "*(&bird) = " << *(&bird) << endl;//获取指针的地址,解除引用显示字符串 cout << "str = " << str << endl;//使用string变量显示字符串 cout << "&str[0] = " << &str[0] << endl;//字符串使用数组表示法传递第一个元素地址显示字符串 cout << "*(&str) = " << *(&str) << endl;//获取地址,再解除引用,没啥意思,但是直接传递地址不显示字符串 cout << "&((*pas)[0]) = " << &((*pas)[0]) << endl;//通过传递第一个元素地址显示字符串 cout << "*pas = " << *pas << endl;//*pas相当于数组名 cout << "*(&(*pas)) = " << *(&(*pas)) << endl;//把*pas作为数组名,获取地址后解除引用显示字符串 //以下会显示地址 cout << "\nDisplay address:\n"; cout << "(int *) animal = " << (int *) animal << endl;//强制显示第一个元素地址 cout << "&animal = " << &animal << endl;//传递整个数组的地址只能显示整个数组的地址 cout << "(int *) bird = " << (int *) bird << endl;//强制显示第一个元素地址 cout << "&str = " << &str << endl;//这是字符串变量的地址,只能显示地址 cout << "pas = " << pas << endl;//传递整个数组的地址只能显示地址,不能显示字符串 cout << "&(*pas) = " << &(*pas) << endl;//把*pas看作数组名,同上,传递整个数组的地址不能显示字符串 return 0; }
编了几行代码演示指针的用法 指针挺搅和的,看着简单,把使用方法弄清楚不容易。不考虑字符串数组、二维数组,我编了个小程序,演示不同的格式到底返回什么内容,作为参考。字符串数组和二维数组总结了再贴过来。运行结果见楼下 #include <iostream> using namespace std; int main() { int arr[3] {3, 2, 1};//声明一个int数组 int * pi = arr;//声明一个指针,指向数组第一个元素 int (*pas)[3] = &arr;//声明一个指针,指向整个数组,*pas相当于数组名 //不能使用int * pas = &arr;指针类型为int(*)[3],而&arr类型为int*,类型不匹配 cout << "Creat these variables:\n";//输出结果和变量声明对照看清楚些 cout << "int arr[3] {3, 2, 1};\n"; cout << "int * pi = arr;\n"; cout << "int (*pas)[3] = &arr;\n\n"; //以下显示第1个元素 cout << "The first element of array:\n"; cout << "arr[0] = " << arr[0] << endl;//数组名使用数组表示法显示第1个元素 cout << "*arr = " << *arr << endl;//数组名使用指针表示法显示第1个元素 cout << "*pi = " << *pi << endl;//指针使用指针表示法显示第1个元素 cout << "pi[0] = " << pi[0] << endl;//指针使用数组表示法显示第1个元素 cout << "(*pas)[0] = " << (*pas)[0] << endl;//指针使用数组表示法显示第1个元素 cout << "*(*pas) = " << *(*pas) << endl;//指针使用指针表示法显示第1个元素 //以下显示第2个元素 cout << "\nThe second element of array:\n"; cout << "arr[1] = " << arr[1] << endl;//数组名使用数组表示法显示第2个元素 cout << "*(arr + 1) = " << *(arr + 1) << endl;//数组名使用指针表示法显示第2个元素 cout << "*(pi + 1) = " << *(pi + 1) << endl;//指针使用指针表示法显示第2个元素 cout << "pi[1] = " << pi[1] << endl;//指针使用数组表示法显示第2个元素 cout << "(*pas)[1] = " << (*pas)[1] << endl;//指针使用数组表示法显示第2个元素 cout << "*(*pas + 1) = " << *(*pas + 1) << endl;//指针使用指针表示法显示第2个元素 //以下显示第1个元素地址,并通过显示第2个元素地址验证 cout << "\nAddress of arr[0] and arr[1]:\n"; cout << "&arr[0] = " << &arr[0] << endl;//对数组第1个元素直接使用地址运算符 cout << "&arr[1] = " << &arr[1] << endl;//对数组第2个元素直接使用地址运算符 cout << "arr = " << arr << endl;//使用数组名显示第1个元素地址 cout << "arr + 1 = " << arr + 1 << endl;//使用数组名显示第2个元素地址 cout << "pi = " << pi << endl;//使用指针显示第1个元素地址 cout << "pi + 1 = " << pi + 1 << endl;//使用指针显示第2个元素地址 cout << "*pas = " << *pas << endl;//使用指针显示第1个元素地址 cout << "*pas + 1 = " << *pas + 1 << endl;//使用指针显示第2个元素地址 //以下显示整个数组地址,并根据指向下一单元地址验证 cout << "\nAddress of whole array and after the array:\n"; cout << "&arr = " << &arr << endl;//对数组名使用地址运算符获取数组地址 cout << "&arr + 1 = " << &arr + 1 << endl;//数组下一单元地址 cout << "pas = " << pas << endl;//使用指向整个数组的指针获取数组地址 cout << "pas + 1 = " << pas + 1 << endl;//数组下一单元地址 cout << "&(*pas) = " << &(*pas) << endl;//对指向整个数组的指针解除引用后使用地址运算符获取数组地址 cout << "&(*pas) + 1= " << &(*pas) + 1 << endl;//数组下一单元地址 //以下显示指针本身的地址,并通过指向下一单元看看指针本身存储的长度 cout << "\nAddress of pointers themselves:\n"; cout << "&pi = " << &pi << endl;//使用地址运算符获取指向数组第1个元素的指针本身的地址 cout << "&pi + 1 = " << &pi + 1 << endl; //获取指针下一单元地址,可以看出用了8个字节 cout << "&pas = " << &pas << endl;//使用地址运算符获取指向整个数组的指针本身的地址 cout << "&pas + 1 = " << &pas + 1 << endl;//获取指针下一单元地址,可以看出用了8个字节 return 0; }
写了几行代码,演示指针的用法 指针挺搅和的,看着简单,把使用方法弄清楚不容易。不考虑字符串数组、二维数组,我编了个小程序,演示不同的格式到底返回什么内容,作为参考。字符串数组和二维数组总结了再贴过来。运行结果见楼下 #include <iostream> using namespace std; int main() { int arr[3] {3, 2, 1};//声明一个int数组 int * pi = arr;//声明一个指针,指向数组第一个元素 int (*pas)[3] = &arr;//声明一个指针,指向整个数组,*pas相当于数组名 //不能使用int * pas = &arr;指针类型为int(*)[3],而&arr类型为int*,类型不匹配 cout << "Creat these variables:\n";//输出结果和变量声明对照看清楚些 cout << "int arr[3] {3, 2, 1};\n"; cout << "int * pi = arr;\n"; cout << "int (*pas)[3] = &arr;\n\n"; //以下显示第1个元素 cout << "The first element of array:\n"; cout << "arr[0] = " << arr[0] << endl;//数组名使用数组表示法显示第1个元素 cout << "*arr = " << *arr << endl;//数组名使用指针表示法显示第1个元素 cout << "*pi = " << *pi << endl;//指针使用指针表示法显示第1个元素 cout << "pi[0] = " << pi[0] << endl;//指针使用数组表示法显示第1个元素 cout << "(*pas)[0] = " << (*pas)[0] << endl;//指针使用数组表示法显示第1个元素 cout << "*(*pas) = " << *(*pas) << endl;//指针使用指针表示法显示第1个元素 //以下显示第2个元素 cout << "\nThe second element of array:\n"; cout << "arr[1] = " << arr[1] << endl;//数组名使用数组表示法显示第2个元素 cout << "*(arr + 1) = " << *(arr + 1) << endl;//数组名使用指针表示法显示第2个元素 cout << "*(pi + 1) = " << *(pi + 1) << endl;//指针使用指针表示法显示第2个元素 cout << "pi[1] = " << pi[1] << endl;//指针使用数组表示法显示第2个元素 cout << "(*pas)[1] = " << (*pas)[1] << endl;//指针使用数组表示法显示第2个元素 cout << "*(*pas + 1) = " << *(*pas + 1) << endl;//指针使用指针表示法显示第2个元素 //以下显示第1个元素地址,并通过显示第2个元素地址验证 cout << "\nAddress of arr[0] and arr[1]:\n"; cout << "&arr[0] = " << &arr[0] << endl;//对数组第1个元素直接使用地址运算符 cout << "&arr[1] = " << &arr[1] << endl;//对数组第2个元素直接使用地址运算符 cout << "arr = " << arr << endl;//使用数组名显示第1个元素地址 cout << "arr + 1 = " << arr + 1 << endl;//使用数组名显示第2个元素地址 cout << "pi = " << pi << endl;//使用指针显示第1个元素地址 cout << "pi + 1 = " << pi + 1 << endl;//使用指针显示第2个元素地址 cout << "*pas = " << *pas << endl;//使用指针显示第1个元素地址 cout << "*pas + 1 = " << *pas + 1 << endl;//使用指针显示第2个元素地址 //以下显示整个数组地址,并根据指向下一单元地址验证 cout << "\nAddress of whole array and after the array:\n"; cout << "&arr = " << &arr << endl;//对数组名使用地址运算符获取数组地址 cout << "&arr + 1 = " << &arr + 1 << endl;//数组下一单元地址 cout << "pas = " << pas << endl;//使用指向整个数组的指针获取数组地址 cout << "pas + 1 = " << pas + 1 << endl;//数组下一单元地址 cout << "&(*pas) = " << &(*pas) << endl;//对指向整个数组的指针解除引用后使用地址运算符获取数组地址 cout << "&(*pas) + 1= " << &(*pas) + 1 << endl;//数组下一单元地址 //以下显示指针本身的地址,并通过指向下一单元看看指针本身存储的长度 cout << "\nAddress of pointers themselves:\n"; cout << "&pi = " << &pi << endl;//使用地址运算符获取指向数组第1个元素的指针本身的地址 cout << "&pi + 1 = " << &pi + 1 << endl; //获取指针下一单元地址,可以看出用了8个字节 cout << "&pas = " << &pas << endl;//使用地址运算符获取指向整个数组的指针本身的地址 cout << "&pas + 1 = " << &pas + 1 << endl;//获取指针下一单元地址,可以看出用了8个字节 return 0; }
谈一谈手指长短对弹奏钢琴的影响(转) 常常听到有人说“某某人的手指又细又长,很适合弹钢琴”、或者“某某人长了一双钢琴家的手,又细又长的”之类的话。甚至不少孩子的家长也会用这样的标准来作为让不让孩子学琴的重要参考条件,仿佛手指短些的孩子无法学好钢琴一样。但其实这些话本身是没有什么道理的,而且说这些话的人恐怕也大都没有见过钢琴家的手是什么样子的。 十几年前看过一本书,书中翻拍了历史上许多著名钢琴家的手的石膏像。说实话,里面很少有符合“又细又长”这个条件的手指。恰恰相反,尽管钢琴家们大都有一双大手,但从比例上来说,绝大多数手指看上去又粗又短,手掌也是又宽又厚。这一点就像歌剧演员大都没有现在流行的模特身材是一个道理,当身体成为演绎音乐的“工具”时,“实用性”远比“观赏性”更为重要。手也一样,钢琴演奏是一项非常职业化的工作,因此强劲有力的手指远比细长优雅的手指更为有利。 在其它条件相同的情况下,通常细长的手指在速度上处于劣势。同样完成一个动作,较长的手指要比较短的手指用的时间更长。哪怕只是百分之一秒的时间,放到音符飞速流动的乐曲中也会产生一定的影响。另外,细长的手指常常在力量上输给看上去粗短的手指。而速度与力度对钢琴演奏是至关重要的。 那么是不是细长的手指就不适合弹钢琴呢?当然不是。如果说较粗的手指常常较有力量、较短的手指常常容易提高速度的话,那么细长的手指在表达音乐的优美与抒情性上常常具有无可比拟的优势。 其实对于弹奏钢琴来说,最重要的手指条件是灵巧、有力、并具有柔韧性与控制能力,而不是外观的大小、粗细与长短。著名作曲家、“钢琴诗人”肖邦的手指作为为数不多的例子,就是完全符合细长这个标准的。尽管现代人都没有听过肖邦本人的演奏,但从他的许多作品中完全可以感受到惊人的速度与力度的存在,而这些作品都是他当年亲自演奏过并获得成功的。多数钢琴家的手远远没有肖邦的手那么“迷人”,但这也丝毫没有影响他们把如泣如诉的音乐段落演奏得沁人心脾。所以仅看手指的样子来判断钢琴演奏技术的发展前景,就像靠外观来挑桔子一样靠不住。 最后要说明的是,这里说的手指外观对钢琴演奏的影响其实是把钢琴演奏的技艺发挥到高超顶点之后的情况。说实话,一万个学琴的孩子里面也出不了一个钢琴家,而一万个钢琴家里面也出不了一个肖邦。对于学习钢琴的孩子们来说,所谓手指长短、粗细的优、劣势绝对小到应该完全忽略不计。我们又何必用这个原本就靠不住、又应该忽略不计的标准当作让不让孩子学琴的参考条件呢? (图为著名钢琴家,钢琴教育大师根那季.齐平教授,看看他老人家的手)
1 下一页