diff --git a/notebooks/03_ParameterPassing.ipynb b/notebooks/03_ParameterPassing.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..f728a4106264ebbf439c4cff565f5af234228f9a
--- /dev/null
+++ b/notebooks/03_ParameterPassing.ipynb
@@ -0,0 +1 @@
+{"metadata":{"orig_nbformat":4,"language_info":{"codemirror_mode":"text/x-c++src","file_extension":".cpp","mimetype":"text/x-c++src","name":"c++","version":"17"},"kernelspec":{"name":"xcpp17","display_name":"C++17","language":"C++17"}},"nbformat_minor":5,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Call-by-Value versus Call-by-Reference","metadata":{},"id":"e7ff4eaa-d800-41b0-b8f9-541d4f8dea11"},{"cell_type":"code","source":"#include <iostream>","metadata":{"trusted":true},"execution_count":3,"outputs":[],"id":"1259a4b8-c4e1-4417-ae0f-fc82ca8bba04"},{"cell_type":"code","source":"void swap( int aLoc, int bLoc ) {\n\n  int aux = aLoc;\n\n  std::cout << \"-> in swap (1): (\" << aLoc << \",\" << bLoc << \")\\n\";\n  aLoc = bLoc;\n  bLoc = aux;\n  std::cout << \"-> in swap (2): (\" << aLoc << \",\" << bLoc << \")\\n\";\n}","metadata":{"trusted":true},"execution_count":4,"outputs":[],"id":"7a9f9c64-4826-41bf-9ae0-694127544a0a"},{"cell_type":"code","source":"int main( void ) {\n\n  int a = 1;\n  int b = 5;\n\n  std::cout << \"in main before swap: (\" << a << \",\" << b << \")\\n\";\n  swap( a, b );\n  std::cout << \"in main after swap:  (\" << a << \",\" << b << \")\\n\";\n}","metadata":{"trusted":true},"execution_count":5,"outputs":[],"id":"628f629d-eaf8-4523-bd3a-c63dc02fde81"},{"cell_type":"code","source":"main();","metadata":{"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"in main before swap: (1,5)\n-> in swap (1): (1,5)\n-> in swap (2): (5,1)\nin main after swap:  (1,5)\n","output_type":"stream"}],"id":"347cce26-5b83-45a9-b951-8db56165683d"},{"cell_type":"markdown","source":"#### Call-by-Value\n- Different strategies exist for passing parameters to subprograms.\n- The C language uses a technique denoted as $\\color{blue}{\\text{call-by-value}}$.\n- The formal parameters in the interface of a function\n   - are local variables existing only in the scope of the function\n   - when the function is called the values of the **arguments are\n     copied into the local variables**\n- Changes to local variables do not affect arguments.","metadata":{},"id":"2ab255de-8324-4e09-b623-c1cb28b28089"},{"cell_type":"markdown","source":"#### Call-by-Reference\n\n- A well-know alternative strategy is denoted as $\\color{red}{\\text{call-by-reference}}$.\n- This is the variant used in the Fortran language family.\n- The formal parameters in the interface of a function\n   - are only placeholders (dummy parameters)\n   - when the function is called they are replaced by memory addresses of  the actual arguments\n- Changes to formal parameters do affect the arguments","metadata":{},"id":"d2d308f1-219f-46ae-961e-b193787e02ea"},{"cell_type":"markdown","source":"In C/C++ we can *emulate* call-by-reference with the help of pointers","metadata":{},"id":"e4413584-2f76-44ef-982d-c067bedf4a2c"},{"cell_type":"code","source":"void swapEm( int* ap, int* bp ) {\n\n  int aux = *ap;\n\n  std::cout << \"-> in swap (1): (\" << *ap << \",\" << *bp << \")\\n\";\n  *ap = *bp;\n  *bp = aux;\n  std::cout << \"-> in swap (2): (\" << *ap << \",\" << *bp << \")\\n\";\n}","metadata":{"trusted":true},"execution_count":7,"outputs":[],"id":"a5dea161-dffb-46d0-8146-523d5b340912"},{"cell_type":"code","source":"int main( void ) {\n\n  int a = 1;\n  int b = 5;\n\n  std::cout << \"in main before swap: (\" << a << \",\" << b << \")\\n\";\n  swapEm( &a, &b );\n  std::cout << \"in main after swap:  (\" << a << \",\" << b << \")\\n\";\n}","metadata":{"trusted":true},"execution_count":8,"outputs":[],"id":"16ec48e9-83af-4126-82e8-6eabae87b057"},{"cell_type":"code","source":"main();","metadata":{"trusted":true},"execution_count":9,"outputs":[{"name":"stdout","text":"in main before swap: (1,5)\n-> in swap (1): (1,5)\n-> in swap (2): (5,1)\nin main after swap:  (5,1)\n","output_type":"stream"}],"id":"33c5b821-9e19-4660-9ab5-a2e4e7ebeb37"},{"cell_type":"markdown","source":"Now working with pointers means we always need to do perform addresscomputations and dereferencing to work with the arguments.\n\nIn C++ we can directly use call-by-reference using references","metadata":{},"id":"08427a4a-65a8-4171-9c1d-e445cec1593f"},{"cell_type":"code","source":"void swapCPP( int& aRef, int& bRef ) {\n\n  int aux = aRef;\n\n  std::cout << \"-> in swap (1): (\" << aRef << \",\" << bRef << \")\\n\";\n  aRef = bRef;\n  bRef = aux;\n  std::cout << \"-> in swap (2): (\" << aRef << \",\" << bRef << \")\\n\";\n}","metadata":{"trusted":true},"execution_count":10,"outputs":[],"id":"0b0a1432-7b59-4d16-ac98-24780094db21"},{"cell_type":"code","source":"main();","metadata":{"trusted":true},"execution_count":11,"outputs":[{"name":"stdout","text":"in main before swap: (1,5)\n-> in swap (1): (1,5)\n-> in swap (2): (5,1)\nin main after swap:  (5,1)\n","output_type":"stream"}],"id":"d1334cfa-4559-4320-8fc9-9ec588544c4a"},{"cell_type":"markdown","source":"### Language Overview:","metadata":{},"id":"7155c4c4-2b9b-452e-8e97-db5aaebb806c"},{"cell_type":"markdown","source":"- The languages currently most often used in Computational Science use different approaches \n| language | supported mechanics               |\n|:--------:|-----------------------------------|\n| C        | call-by-value                     |\n| Fortran  | call-by-reference                 |\n| C++      | call-by-value & call-by-reference |\n| Python   | call-by-sharing/object/assignment |\n- Python: everything is an object, either mutable or immutable and no variables exist (only names)\n- References in C++ cannot be copied","metadata":{"tags":[]},"id":"87403469-d884-4c95-a100-40b8d5de334d"},{"cell_type":"code","source":"#include <vector>\n\n// create a vector of ints\nstd::vector< int > a = {1,3,7,9};","metadata":{"trusted":true},"execution_count":1,"outputs":[],"id":"b8f3e2f7-5659-4d4b-aa3c-73a879eb0caa"},{"cell_type":"code","source":"a","metadata":{"trusted":true},"execution_count":2,"outputs":[{"execution_count":2,"output_type":"execute_result","data":{"text/plain":"{ 1, 3, 7, 9 }"},"metadata":{}}],"id":"211a4a4d-83e1-4ed1-9a20-62b099df03d4"},{"cell_type":"code","source":"a[0] = -1;         // change first element by direct access\na.push_back( 11 ); // append element at the end\na","metadata":{"trusted":true},"execution_count":3,"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"{ -1, 3, 7, 9, 11 }"},"metadata":{}}],"id":"acdec801-802f-4693-91f7-25deb3f87f13"},{"cell_type":"code","source":"#include <iostream>\n#include <vector>\n\nvoid test() {\n  // note that the std::vector stores copies\n  int val = 10;\n  std::vector< int > foo;\n  foo.push_back( val );\n  foo[0] = 2;\n  std::cout << foo[0] << std::endl;\n  std::cout << val;\n}\n\ntest()","metadata":{"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"2\n10","output_type":"stream"}],"id":"e2ffe5d4-e4f9-4fff-956e-ae35238b2d96"},{"cell_type":"code","source":"// create a vector of pointers to int\nstd::vector< int* > ptrVec;\n\n// try to create a vector of references to int\n// std::vector< int& > fail;","metadata":{"trusted":true},"execution_count":4,"outputs":[],"id":"41e83505-e0da-4251-97c5-34c0b7f9b3fa"},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[],"id":"8555c6be-c957-46ed-9705-3a96d8349a36"}]}
\ No newline at end of file